1. ホーム
  2. websocket

[解決済み] ロードバランシングウェブソケット

2022-08-08 07:59:14

質問

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のようなサイトはそうしません。どうやっているのでしょうか?

どのように解決するのですか?

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

また、64k のハードリミットは 発信 TCP/IP にのみ適用されることに注意してください。着信 TCP/IP には適用されません。私たちがテストしたのは Autobahn (高性能 WebSocket サーバー) を 2 コア、4GB RAM の VM 上で 200k のアクティブな接続でテストしました。

また、最初の WebSocket ハンドシェイク中に発表された HTTP パスで L7 ロードバランシングを行うことができることに注意してください。この場合、ロード バランサーは状態 (どのソース IP ポート ペアがどのバックエンド ノードに行くのか) を維持する必要があります。まともな設定であれば、おそらく数百万の接続までスケールするでしょう。

免責事項:私はAutobahnの原著者であり、Tavendoのために働いています。