スケーリングのために HTTP サーバーの複数のインスタンスを実行すると便利です。
ただし、各サーバー インスタンスにはクライアントへの独自の接続セットがあるため、これは WebSocket では機能しないようです。
すべてのサーバー インスタンスが共通の接続セットを共有する必要がある場合、複数のサーバー インスタンスで WebSocket を実行するにはどうすればよいでしょうか?
スケーリングのために HTTP サーバーの複数のインスタンスを実行すると便利です。
ただし、各サーバー インスタンスにはクライアントへの独自の接続セットがあるため、これは WebSocket では機能しないようです。
すべてのサーバー インスタンスが共通の接続セットを共有する必要がある場合、複数のサーバー インスタンスで WebSocket を実行するにはどうすればよいでしょうか?
私は、スケーリング可能な websocket アプリを開発するために同じことを探していましたが、これについて議論する記事はあまりないようです。
ケース 1推奨されるアプローチは、 Herokuが提案 するように Redis キャッシュを使用するか、Service Bus を使用するか、SignalRのスケールアウトで説明されている 3 つのアプローチのように db に格納することです。ただし、キャッチがあります。2 番目のインスタンスが知りたいために、スケジューラまたはバックグラウンド ワーカー/サービスを継続的に実行して、cache/queue/dbの新しい変更を検出する必要があるため、わずかな待ち時間が必要です。
Case 2 私の場合、リアルタイムに近い高周波が欲しい。そのため、インスタンス間に永続的な接続が必要です。ただし、課題は、ステートレス Web サーバー間でそれを行うことができないことです。
したがって、中間の長期実行バックグラウンド/ワーカー サービスが必要であり、コードから独自のネット/ソケット/TCP を実装し、接続プールを維持する必要がありますが、それは簡単な作業ではありません。
サーバー上の Websocket クライアントを(このサービスのために)使用することを考えているので、クライアントとインスタンス間の通信パターンはほぼ同じです。これを参照してください:1 2。残っていることの 1 つは、インスタンスのアップ/ダウンごとにインスタンスの IP/URL を分散キャッシュまたはデータベースに更新することです。
最後のオプションは、新しいWebRTCを探索することです
まだ試していませんが、接続をスティッキーにすることで問題が解決する可能性があると考えています。この設定は、ロード バランサーで設定できます。
これまでに見つけた最善の解決策はhttp://pusher.com/です。
セットアップが簡単。素晴らしいドキュメント。