123

Webソケットの負荷分散方法について質問があります。

Webソケットをサポートするサーバーがあります。ブラウザは私のサイトに接続し、それぞれがへのWebソケットを開きますwww.mydomain.com。そうすれば、私のソーシャルネットワークアプリはクライアントにメッセージをプッシュできます。

従来は、HTTPリクエストのみを使用して、2台のWebサーバーの前に2台目のサーバーとロードバランサーを追加してスケールアップしていました。

Webソケットの場合、接続はロードバランサーではなく、Webサーバーと直接行う必要があります。これは、マシンに64kのオープンポートなどの物理的な制限があり、クライアントがロードバランサーに接続している場合、サポートできなかったためです。 64kを超える同時ユーザー。

では、どうすればよいですか?

  1. ページが読み込まれたときに、クライアントが(ロードバランサーではなく)Webサーバーに直接接続するようにしますか?ノードからJavaScriptをロードするだけで、ロードバランサー(またはその他)が、ページが最初に要求されるたびに、スクリプトのURLをランダムに変更しますか?

  2. リップルスタートを処理しますか?Webサーバーがシャットダウンすると、ブラウザは接続が閉じられたことを認識します。JavaScriptコードを記述して接続を再開しようと試みることはできますが、ノードはしばらくの間失われます。では、ロードバランサーに戻って、使用する次のノードのアドレスを照会する必要があると思いますか?

  3. ロードバランサーが最初のリクエストでリダイレクトを送信するので、ブラウザーが最初にリクエストwww.mydomain.comしてにリダイレクトされるのではないかと思いましたwww34.mydomain.com。ノードがダウンするまで、それは非常にうまく機能します-そしてFacebookのようなサイトはそれをしません。どうやってやっているの?

4

3 に答える 3

111

ソースIPポートハッシュに基づいてIPパケットをWebSocketサーバーファームに分散するL3ロードバランサーを配置します。L3バランサーは状態を維持しないため(ハッシュされたソースIPポートを使用)、ローエンドハードウェア(たとえば10GbE)のワイヤ速度に合わせてスケーリングされます。配布は決定論的であるため(ハッシュされたソースIPポートを使用)、TCP(したがってWebSocket)で機能します。

また、64kのハード制限は、特定の(送信元)IPアドレスの発信TCP/IPにのみ適用されることに注意してください。着信TCP/IPには適用されません。2コアの4GBRAMVMで200kのアクティブな接続を使用して、Autobahn (高性能WebSocketサーバー)をテストしました。

また、最初のWebSocketハンドシェイク中にアナウンスされたHTTPパスでL7ロードバランシングを実行できることにも注意してください。その場合、ロードバランサーは状態を維持する必要があります(どのソースIPポートペアがどのバックエンドノードに送信されるか)。それでも、適切なセットアップでは、おそらく数百万の接続に拡張できます。

免責事項:私はアウトバーンの原作者であり、タヴェンドで働いています。

于 2012-09-21T08:27:36.553 に答える
5

WebSocketサーバーロジックがsocket.ioを使用してnodejsで実行されている場合、同期に共有redisキー/値ストアを使用するようにsocket.ioに指示できることに注意してください。このように、ロードバランサーを気にする必要さえなく、イベントはサーバーインスタンス間で伝播します。

var io = require('socket.io')(3000);
var redis = require('socket.io-redis'); 
io.adapter(redis({ host: 'localhost', port: 6379 }));

参照:ソケットIO-複数のノードの使用

しかし、ある時点で、redisがボトルネックになる可能性があると思います...

于 2016-08-31T13:14:39.787 に答える
2

検査と「ルーティング機能」を使用して、レイヤー7の負荷分散を実現することもできます。

「StingrayTrafficManagerを使用してWebSocketトラフィックを検査および負荷分散する方法、および必要に応じて、同じIPアドレスとポートで受信されるWebSocketとHTTPトラフィックを管理する方法」を参照してください。https://splash.riverbed.com/docs/DOC-1451

于 2013-10-21T16:44:29.767 に答える