Heroku の WebSocket
最終更新日 2024年05月07日(火)
Table of Contents
WebSocket プロトコルは、最近のリアルタイム Web アプリケーションの中核技術です。このプロトコルにより、クライアントとサーバー間でデータの送受信を行うための双方向チャネルが提供されます。セキュリティモデルと HTTP プロトコルに埋め込まれたメタデータが追加されるため、柔軟な TCP 通信を実現できます。
WebSocket プロトコルについての詳細は、RFC 6455 を参照してください。Heroku では、このバージョンをサポートしています。
それ以前のドラフトでも互換性がある可能性はありますが、直接はサポートしていません。draft hixie-76 では互換性のない機能があることが判明しています。このドラフトでは、鍵データをアドバタイズせず、ヘッダーの後に追加してリバースプロキシとゲートウェイを通過する方式が使用されていました。
アプリケーションのアーキテクチャ
プロセスとアプリケーションの状態
WebSocket プロトコルにより、一般的にステートレスなアプリケーションアーキテクチャで状態を利用できるようになります。 このプロトコルには、ステートレスなシステムのノードへの持続的な接続を作成するためのメカニズムが用意されています。 このため、各 Web プロセスで独自の WebSocket 接続の状態を 維持する必要があります。アプリケーションデータがプロセス間で共有される場合は、グローバルな状態も維持する必要があります。
Redis の Pub または Sub チャネルから接続中の全ユーザーにメッセージをプッシュ送信するチャットアプリケーションがあるとします。この場合、各 Web プロセスに、アクティブユーザーから開かれた持続的な WebSocket 接続の集まりが 1 つ存在します。 各ユーザーが Redis チャネルへの独自のサブスクリプションを保有することはありません。 Web プロセスによって Redis への単一の接続が維持され、受信メッセージが届くと、接続中の各ユーザーの状態が更新されます。
この例では、Web プロセスの状態はアプリケーションが維持し、グローバルな状態は Redis が維持しています。
Redis のプロバイダーを探すには、Elements Marketplace にアクセスしてください。
セキュリティに関する考慮事項
ベストプラクティスについての情報は、「WebSocket のセキュリティ」の記事を参照してください。
タイムアウト
通常の Heroku の HTTP ルーティングタイムアウトルールが WebSocket 接続に適用されます。時々、接続を通じて Ping パケットを送信することで、クライアントまたはサーバーで接続がアイドル状態にならないようにすることができます。
キープアライブ(Keep-Alive)
WebSocket に対応しているエンドポイントでは、HTTP のキープアライブを使用できます。詳細は、Heroku ルーターのドキュメントを参照してください。
実装例
以下の例では、WebSocket 接続を確立してデータの送受信を行うために必要な最小限のコードを示しています。さらに高度なアプリケーションを開発するための言語別のガイドについては、「参考情報」セクションを参照してください。