16

EC2でSocket.ioを実行するNodeJSアプリケーションサーバーのグループをセットアップすることを計画しており、ElasticLoadBalancer使用してそれらの間で負荷を分散したいと思います。ELBがそのままWebSocketをサポートしていないことは知っていますが、シナリオ2で説明したセットアップを使用できます。

ただし、ブログ投稿で説明されているように、この設定ではセッションアフィニティやソースIP情報が提供されないことに気付きました。

ELBはHTTPメッセージを解析していないため、この設定ではSession AffinityヘッダーもX-Forwardヘッダーも使用できません。そのため、Cookieを照合してSession Affinityを確認したり、特別なX-Forwardヘッダーを挿入したりすることはできません。

Socket.ioはこれらの状況でも機能しますか?または、SSLを使用してロードバランサーの背後にSocket.ioアプリサーバーのセットを配置する別の方法はありますか?

編集:ティムキャスウェルはすでにここでこれを行うことについて話します。これを設定する方法を説明する投稿はありますか?ここでもセッションの粘着性はありませんが、問題なく機能しているようです。

余談ですが、WebSocketでのスティッキーセッションは実際に必要ですか?情報は新しい個別のリクエストとして送信されますか、それともすべての情報が移動するリクエストと接続が1つだけですか?

4

4 に答える 4

15

Socket.io は、Websocket への接続をアップグレードする前に 2 つの HTTP 要求を行うため、TCP ELB を使用してもそのままでは機能しません。

socket.io は websocket 以上のものをサポートするため、最初の接続はプロトコルを確立するために使用されます。

GET /socket.io/1/?t=1360136617252 HTTP/1.1
User-Agent: node-XMLHttpRequest
Accept: */*
Host: localhost:9999
Connection: keep-alive

HTTP/1.1 200 OK
Content-Type: text/plain
Date: Wed, 06 Feb 2013 07:43:37 GMT
Connection: keep-alive
Transfer-Encoding: chunked

47
xX_HbcG1DN_nufWddblv:60:60:websocket,htmlfile,xhr-polling,jsonp-polling
0

2 番目の要求は、実際に接続をアップグレードするために使用されます。

GET /socket.io/1/websocket/xX_HbcG1DN_nufWddblv HTTP/1.1
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: MTMtMTM2MDEzNjYxNzMxOA==
Host: localhost:9999

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 249I3zzVp0SzEn0Te2RLp0iS/z0=

上記の例でxX_HbcG1DN_nufWddblvは、リクエスト間の共有キーであることがわかります。これが問題です。ELB はラウンド ロビン ルーティングを行います。つまり、アップグレード リクエストは、最初のネゴシエーションに参加しなかったサーバーにヒットします。そのため、サーバーはクライアントが誰であるかを知りません。

インメモリ ステートフル データは負荷分散の敵です。ありがたいことに、socket.io は Redis を使用してデータを保存することをサポートしています。複数のサーバーと redis 接続を共有する場合、それらは基本的にすべてのクライアントのセッションを共有します。

Redis のセットアップの詳細については、socket.io wiki ページを参照してください。

于 2013-02-06T18:27:44.520 に答える
5

投稿で述べたように、私たちは ELB のみを使用して、ssl ターミネーションと、websocket をサポートする http-proxy サーバーのクラスター間での負荷分散を行います。ELB は websocket サーバーと直接通信しません。HTTP プロキシ クラスタは、接続する適切な socket.io サーバーのルックアップを処理して、セッションの持続性を確保します。

于 2012-11-14T15:42:43.970 に答える