6

現在、次のような水平方向にスケーラブルな socket.io サーバーを作成しています。

                 LoadBalancer (nginx)

      Proxy1      Proxy2      Proxy3      Proxy{N}

 BackEnd1   BackEnd2   BackEnd3   BackEnd4   BackEnd{N}

私の質問は、socket-io redis モジュールを使用して、すべてが同じ redis サーバーに接続されている場合、バックエンド サーバーの 1 つからプロキシ サーバーの 1 つに接続されている特定のソケットにメッセージを送信できますか? もしそうなら、どうすればいいですか?

4

2 に答える 2

3

socket.io サーバーをスケーリングし、nginx をロード バランサーとして使用した場合は、セットアップを忘れないでください。それsticky load balancing以外の場合は、単一の接続がロード バランサーに基づいて複数のサーバーに接続され、socket.io サーバーへの接続が渡されます。使ったほうがいいsticky load balancing

redis socket io アダプターを使用すると、 を使用して 1 つ以上の socket.io サーバーとメッセージを送受信できますRedis Pub/Sub implementation

プロキシとバックエンドに使用されているテクノロジーを教えていただければ、これに関する詳細情報をお知らせします。

于 2015-12-11T13:35:35.753 に答える
2

socket.io-redis モジュールを使用すると、すべてのバックエンド サーバーが接続ユーザーの同じプールを共有します。Backend1 から送信できます。クライアントが Backend4 に接続されている場合、クライアントはメッセージを受け取ります。

これが Socket.io で動作するための鍵は、nginx でスティッキー セッションを使用して、クライアントが接続すると同じマシンに留まるようにすることです。これは、socket.io が WebSocket といくつかの長いポーリング スレッドで開始する方法であり、正しく機能するには、それらがすべて同じバックエンド サーバー上にある必要があるためです。

スティッキー セッションの代わりに、Websocket のみを使用するようにクライアント接続オプションを変更できます。これにより、1 つの Websocket という 1 つの接続しか存在しないため、複数のサーバーへの複数の接続に関する問題が解消されます。これにより、アプリは WebSocket ではなくロング ポーリングにダウングレードできなくなります。

于 2015-12-15T20:23:14.537 に答える