2016-05-12 3 views
0

は、私はいくつかのことを理解することができません。トルネードのWebSocketインスタンス(nginxの、HaProxy)

注:トルネードとだけで実行しているWebSocketを私の問題ではありません、私はそれが仕事を得ることができ、比較的簡単に多くのプロジェクトでそれを使用している、 が、すべて単一の竜巻のインスタンスとしてで/逆なしプロキシまたは ロードバランサ(nginx)、両方とも正常です。言ったことで

、私の疑問は、ロードバランサ背後に複数の竜巻のWebSocketのインスタンスを処理する方法に関するされています。

使用事例:ユースケースを見てみましょう 2トルネードのWebSocketインスタンス、T1とnginxの背後T2と3つのクライアント(ブラウザ)がある、と言うことができますC1C2,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つである場合、インスタンスを正しく動作させるには正確に何を保存する必要がありますか?

答えて

1

メッセージは常に接続に接続されます。それらは個別に負荷分散されません。したがって、ステップ4では、nginxはC1コネクションのメッセージをT2ではなくT1に送信します。

+0

これは、TornadoでWS接続を作成するときはいつでも、負荷分散は役に立たないということですか?なぜなら、Torandoのインスタンスの両方が最初はNginxによってバランスされた同じ数のWS接続を持っていて、次にTornadoインスタンスのうちの1つへのWS接続のほとんどが閉じられるから、WSメッセージが送信されるたびに(開いているもの)それらはすべてそれらのWS接続を作成したTornadoインスタンスに送信されるため、ロードバランシングは起こらず、Nginxのロードバランシングを使用しないすべてのWSリクエストで1つのインスタンスがヒットします。 –

+0

また、接続にメッセージが添付されていることは知っていますが、nginxはバックエンドアプリケーションサーバーによってどのような接続が開始されたのか、それらの情報をどのように保存していますか?私はこれについては分かりません。 –

+0

ロードバランシングは、新しい接続が作成されたときにのみ機能します。例えば不均衡になることがあります。サーバが再起動したときに、新しい接続が開かれ古いものが閉じられると、長期的にはスムーズになります。 Nginxはクライアントとバックエンド接続の間のマッピングを内部的に追跡します。 –

関連する問題