[解決済み] ロードバランシングウェブソケット
質問
Webソケットの負荷分散方法について質問です。
私は、Web ソケットをサポートするサーバーを持っています。ブラウザが私のサイトに接続し、それぞれがウェブソケットを開いて
www.mydomain.com
. このようにして、私のソーシャルネットワークアプリは、クライアントにメッセージをプッシュすることができます。
従来は、HTTP リクエストだけを使用して、2 台の Web サーバーの前に 2 台目のサーバーとロードバランサーを追加することでスケールアップしていました。
Web ソケットでは、接続はロードバランサーではなく Web サーバーと直接行う必要があります。マシンが 64k のオープンポートという物理的な制限を持ち、クライアントがロードバランサーに接続していた場合、64k 以上の同時ユーザーをサポートすることはできないからです。
では、どのようにすればよいのでしょうか。
-
ページがロードされるときに、クライアントが (ロードバランサーではなく) Web サーバーに直接接続するようにするにはどうしたらよいでしょうか? 単にノードから JavaScript をロードし、ページが最初に要求されるたびに、ロード バランサー (またはその他) がスクリプトの URL をランダムに変更するのでしょうか?
-
はリップルスタートを処理しますか? Web サーバーのシャットダウンに伴い、ブラウザは接続が閉じられたことに気付きます。接続を再開しようとする JavaScript のコードを書くことはできますが、ノードがしばらく消えてしまうでしょう。そこで、ロードバランサーに戻って、次に使用するノードのアドレスを問い合わせる必要があるのではないでしょうか?
-
ロードバランサーが最初のリクエストでリダイレクトを送ることについて、私は不思議に思っていました。
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のために働いています。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン