は、私はいくつかのことを理解することができません。トルネードのWebSocketインスタンス(nginxの、HaProxy)
注:トルネードとだけで実行しているWebSocketを私の問題ではありません、私はそれが仕事を得ることができ、比較的簡単に多くのプロジェクトでそれを使用している、 が、すべて単一の竜巻のインスタンスとしてで/逆なしプロキシまたは ロードバランサ(nginx)、両方とも正常です。言ったことで
、私の疑問は、ロードバランサ背後に複数の竜巻のWebSocketのインスタンスを処理する方法に関するされています。
使用事例:ユースケースを見てみましょう 2トルネードのWebSocketインスタンス、T1とnginxの背後T2と3つのクライアント(ブラウザ)がある、と言うことができますC1、C2,C3。
______|-------|
C1-----------------| | | T1 |
| | |_______|
C2-----------------|---> Nginx --->|
| | |-------|
C3-----------------| |______| T2 |
|_______|
ステップ1からC1
位置w.x.y.z:80
でのWebSocketの接続を開始しました。今nginxの負荷が接続をバランスにT1の(トルネードさん)のWebSocketハンドラ内open
イベントをトリガしたT1
を、言うことができます。今度はT1は開いているwebsocket接続オブジェクトを知り、オブジェクトをw1
とする。
ステップ2 - 今、C2
は、上記と同様のWebSocket接続を開始し、今nginxのはT2の(トルネードの)をトリガT2
にそれをバランスLAODのWebSocketハンドラのopen
イベント。今度はT2は開いているwebsocket接続オブジェクトを知り、オブジェクトをw2
とする。
ステップ3 - 今、同様C3
は、オブジェクトがw3
なりましょう、nginxの負荷が今新しい開いたのWebSocket接続オブジェクトを持つT1、それをバランス、WebSocketの接続を開始しました。
ステップ4 - 今、C1
、私たちの最初のクライアントは、ws
がでのWebSocket接続を作成するために使用されるブラウザ(クライアント)側のWebSocketのオブジェクトであるブラウザのws.send()
方法、を経由してメッセージを送りましたステップ1。だから、メッセージがNginxに到達したとき、それはT2に負荷を分散します。 T2へ
Now here is my question.
んnginxの負荷バランスそれがまたはそれはT1自体へのプロキシ 要求をする必要があることを知っていますか?
それはT1であることから、そのT2ののWebSocketハンドラが処理しようとすると、今T2は、それにw1
オブジェクトを持っていない、それはT2に送信したともともとon_message
ハンドラをトリガすべき要求、今、
何が起こりますかこの状態で、T2が例外を発生させるか、または が正確に発生しますか? は、ロードバランサの背後で実行複数の竜巻のインスタンスがあるとき
また、どのようにこれらの例でのWebSocket接続を管理するために、はどのように このを解決するには?
我々は解決策としてRedis
を使用すると仮定した場合、Redisのは実際に何を保存しますか? The websocket objects?
またはRedis
がの提案するソリューションの1つである場合、インスタンスを正しく動作させるには正確に何を保存する必要がありますか?
これは、TornadoでWS接続を作成するときはいつでも、負荷分散は役に立たないということですか?なぜなら、Torandoのインスタンスの両方が最初はNginxによってバランスされた同じ数のWS接続を持っていて、次にTornadoインスタンスのうちの1つへのWS接続のほとんどが閉じられるから、WSメッセージが送信されるたびに(開いているもの)それらはすべてそれらのWS接続を作成したTornadoインスタンスに送信されるため、ロードバランシングは起こらず、Nginxのロードバランシングを使用しないすべてのWSリクエストで1つのインスタンスがヒットします。 –
また、接続にメッセージが添付されていることは知っていますが、nginxはバックエンドアプリケーションサーバーによってどのような接続が開始されたのか、それらの情報をどのように保存していますか?私はこれについては分かりません。 –
ロードバランシングは、新しい接続が作成されたときにのみ機能します。例えば不均衡になることがあります。サーバが再起動したときに、新しい接続が開かれ古いものが閉じられると、長期的にはスムーズになります。 Nginxはクライアントとバックエンド接続の間のマッピングを内部的に追跡します。 –