socketioクラスタ公式文書
粘性負荷バランス
接続負荷が異なるプロセスまたはコンピュータ間で割り振られる予定の場合、特定のセッションIDに関連する要求が、それらを開始するプロセスに接続されることを確実にする必要がある.
これは、XHRポーリングまたはJSONPポーリングのようないくつかの送信が、「ソケット」のライフサイクルに依存して複数の要求をトリガするためである.スティッキーのバランスを有効にしないと怖いです.
なぜ必要なのかを説明するために、すべての接続されたクライアントにイベントを送信する例を考慮してください.
彼らがロングポーリングを使うと、彼らは私たちが記入できるように要求を送信しないかもしれません.彼らはこれらの要求の間に介在するかもしれない.これらの場合、このプロセスでメッセージをバッファリングしなければならないということです.これらのメッセージをクライアントが要求を送信する際に成功させるために、最も簡単な方法は同じプロセスに接続することである.
上記のように、
スティッキーセッションを実現するには、2つの主要な解決策があります.は、クライアント をクライアントの開始アドレスに従ってルーティングする.、クッキーに基づいてクライアント をルーティングする.
NFRXプロファイル
ファイルの
例
Appache HTTPD配置
HAProxy配置
Node.JSグループを使用します
NginXのように、Node.JSは、
Fedor Indutnyは、ファイル記述子(すなわち、接続)が元のルーティング
また、グループワークプログラムIDに基づいて、グループ化された各スタッフに異なるポートを割り当てることができ、上記の構成バランス負荷を使用しても良いです.
ノード間でイベントを転送する
現在、接続を受け付けている複数のソケット・IOノードがありますが、イベントを各人(または部屋の中の一人)にブロードキャストするには、プロセスまたはコンピュータの間でメッセージを送る方法が必要です.
ルーティング・メッセージを担当するインターフェースは、私たちが言っている
注意:Redisアダプタを使用する場合は、依然としてスティッキーセッションが必要です.
nonsocket.ioプロセスからメッセージを送信する場合は、「外部世界からメッセージを送信する」を参照してください.
接続負荷が異なるプロセスまたはコンピュータ間で割り振られる予定の場合、特定のセッションIDに関連する要求が、それらを開始するプロセスに接続されることを確実にする必要がある.
これは、XHRポーリングまたはJSONPポーリングのようないくつかの送信が、「ソケット」のライフサイクルに依存して複数の要求をトリガするためである.スティッキーのバランスを有効にしないと怖いです.
WebSocket : :400
これは、アップグレード要求が所与のソケットIDを知らないノードに送信されることを意味し、HTTP 400が応答する.なぜ必要なのかを説明するために、すべての接続されたクライアントにイベントを送信する例を考慮してください.
io.emit('hi','all sockets');
一部の顧客は、WebSocket
のようなアクティブな双方向通信チャネルを持っているかもしれないが、そのうちのいくつかは、長ポーリングを使用しているかもしれない.彼らがロングポーリングを使うと、彼らは私たちが記入できるように要求を送信しないかもしれません.彼らはこれらの要求の間に介在するかもしれない.これらの場合、このプロセスでメッセージをバッファリングしなければならないということです.これらのメッセージをクライアントが要求を送信する際に成功させるために、最も簡単な方法は同じプロセスに接続することである.
上記のように、
WebSocket
送信には、クライアントと所与のサーバとの間で、最下のTCP接続が開かれているため、この制限はない.これはなぜですか?WebSocket
だけを使用して送信されたいくつかの提案を見つけることができます. = 10(“https://io.yourhost.com”,{ // : , :[ “ WebSocket” ] // [“ WebSocket”,' polling'], })
どちらもwebsocket接続が確立できない場合、ロングポーリングはFALLBACKがないことを意味しています.これは実はSocket.IOの重要な特性の一つです.この場合、オリジナルWebsocketを使うか、またはrobust-websocketのようなスリム包装器を使うべきです.スティッキーセッションを実現するには、2つの主要な解決策があります.
NFRXプロファイル
ファイルの
http { }
部分にnginx.conf
があります.次の各項目の間で負荷を均衡させるために、ソケット・IOプロセスリストの一部をupstream
が含むと宣言してもいいです.http { server { listen 3000 ; server_name io.yourhost.com;
location / { proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for ; proxy_set_header Host $ host ;
proxy_pass http:// nodes;
#enable WebSockets proxy_http_version 1。1 ; proxy_set_header $ http_upgrade ; proxy_set_header “ ” ; } }
{ # IP ip_hash ;
app01:3000 ; app02:3000 ; app03:3000 ; } }
ip_hash
は、接続がスティッキーになることを示す命令であることに注意してください.worker_processes
の最上階にいることを確認して、NFRXがどれぐらいの従業員を使うべきかを指示します.ブロック内のworker_connections
の設定を調整したいかもしれません.例
Appache HTTPD配置
Set-Cookie “SERVERID = sticky。%{BALANCER_WORKER_ROUTE} e; path = /” env = BALANCER_ROUTE_CHANGED
BalancerMember “http:// app01:3000” route = app01 BalancerMember “http:// app02:3000” route = app02 BalancerMember “http:// app03:3000” route = app03 ProxySet stickysession = SERVERID Proxy>
BalancerMember “ws:// app01:3000” route = app01 BalancerMember “ws:// app02:3000” route = app02 BalancerMember “ws:// app03:3000” route = app03 ProxySet stickysession = SERVERID Proxy>
RewriteEngine On
RewriteCond %{HTTP:Upgrade} = websocket [NC]
RewriteRule /(.*)balancer:// nodes_ws / $ 1 [P,L]
RewriteCond %{HTTP:Upgrade}!= websocket [NC]
RewriteRule /(.* )balancer:// nodes_polling / $ 1 [P,L]
ProxyTimeout 3
例HAProxy配置
# :http://blog.haproxy.com/2012/11/07/websockets-load-balancing-with-haproxy/
listen chat
bind *:80
default_backend
httpchk HEAD /
http 200
cookie io nocache#
`io` cookie app01 app01:3000 cookie app01
app02 app02:3000 cookie app02
app03 app03:3000 cookie app03
例Node.JSグループを使用します
NginXのように、Node.JSは、
events { }
モジュールを介して内蔵のクラスタサポートを提供する.Fedor Indutnyは、ファイル記述子(すなわち、接続)が元のルーティング
cluster
(すなわち、IP)に基づいてルーティングされることを保証するスティッキーセッションというモジュールを作成した.これは経路の不均衡を引き起こす可能性があります.具体的にはハッシュ方法に依存します.また、グループワークプログラムIDに基づいて、グループ化された各スタッフに異なるポートを割り当てることができ、上記の構成バランス負荷を使用しても良いです.
ノード間でイベントを転送する
現在、接続を受け付けている複数のソケット・IOノードがありますが、イベントを各人(または部屋の中の一人)にブロードキャストするには、プロセスまたはコンピュータの間でメッセージを送る方法が必要です.
ルーティング・メッセージを担当するインターフェースは、私たちが言っている
remoteAddress
です.あなたはsocket.io-adapperの上で自分の(それを受け継ぐことによって)を実現することができて、あるいはあなたは私達のRedisの上で提供するそれを使うことができます:socket.io-redis:var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host:'localhost',port:6379 }));
そして以下の電話です.io.emit('hi','all sockets');
Redisを通過します Pub/Subのメカニズムは、各ノードにブロードキャストされる.注意:Redisアダプタを使用する場合は、依然としてスティッキーセッションが必要です.
nonsocket.ioプロセスからメッセージを送信する場合は、「外部世界からメッセージを送信する」を参照してください.