socketioクラスタ公式文書


粘性負荷バランス
接続負荷が異なるプロセスまたはコンピュータ間で割り振られる予定の場合、特定のセッション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プロセスからメッセージを送信する場合は、「外部世界からメッセージを送信する」を参照してください.