🚇

WebSocket 接続のハンドリング (1) WebSocket パススルー

2024/12/07に公開

この記事は Fastly Compute 一人アドベントカレンダー 2024 7 日目の記事です。

Fastly Compute の特徴的な機能である WebSocket の利用方法について紹介するシリーズ(WebSocket 接続のハンドリング)の第一回目です。Fastly Compute で WebSocket を扱う方法は 2 種類の方法があり(パススルーと Fanout)、それぞれの方式でできること実装方法や活用できるポイントが異なってきます。本稿ではこのうちパススルーでの接続方法について簡単にまとめてみたいと思います。

実装

実装は非常にシンプルで、以下のようなコードで実装可能です。

use fastly::{Error, RequestHandle};

fn main() -> Result<(), Error> {
    let req = RequestHandle::from_client();

    if let Some("websocket") = req.get_header_value("Upgrade") {
        return Ok(req.handoff_websocket("ws_backend_name")?);
    }

    Ok(req.send("non_ws_backend_name")?.send_to_client())
}

Go SDK でも同様に handoff.Websocket("origin_0") のような呼び方でパススルー接続が可能になります(APIリファレンス)。JS SDK では本稿執筆時点(2024/12)ではまだ対応する実装がありません。

特徴というか使い所としては、handoff 前であれば、req.set_header("x-some-header", "xxxxx") など通常の書き方で Request ヘッダの追加や修正が可能なところです。今年の 10 月に OpenAI が WebSocket で接続して利用する Realtime API をリリースしたことが記憶に新しい方もいらっしゃると思いますが、例えばこのような API の前段に本稿で紹介するような WebSocket のパススルー用のサーバを配置することで、エンドユーザからは見えない形で認証用の API Key を Authorization ヘッダに付加するなど、API Key ベースで動く WebSocket サービスの利用環境を簡単にユーザに提供する時にも便利に使えたりします。

備考/注意点

Developer Doc の方にいくつか備考や注意点が記載されていますのでそちらを参照してください。handoff が実施されると バックエンドの設定のうち between_bytes_timeout が適用されなくなるなどの注意点が記載されています。

https://www.fastly.com/documentation/guides/concepts/real-time-messaging/websockets-tunnel/

まとめ

本稿では WebSocket をパススルー接続で利用する場合の概要と実装について概要を紹介しました。

次回は Fastly Compute を使って実現できる WebSocket 接続のハンドリングのうち、リアルタイムメッセージング処理について豊富な機能を持つ Fanout について紹介します。

Discussion