0

私のアプリケーション (Tomcat にデプロイされている) は、クライアント (A とします) とサーバー (B とします) の 2 つの戦争に遭遇しました。どちらも同じ jvm にデプロイされ、Web サービスを介して通信します。アプリケーションをスケーラブルにするために、これをクラスタ化して複数のノードにデプロイしたいと考えています。以下は、Apache サーバーでのロード バランサーの構成です。

<Proxy balancer://mycluster stickysession=JSESSIONID>
BalancerMember ajp://127.0.0.1:8009 min=10 max=100 route=jvm1 loadfactor=1
BalancerMember ajp://127.0.0.1:8019 min=20 max=200 route=jvm2 loadfactor=1
</Proxy>

ProxyPass /A balancer://mycluster/A
ProxyPass /B balancer://mycluster/B

私のクライアントアプリケーションでは、サーバーのURLは以下のように提供されています

server.url=http://localhost/B/myservice/

私の意図は、ノード上の Web アプリ A に到達する要求は、同じノードの Web アプリ B で処理される必要があるということです。しかし、現在の構成では、意図した結果が得られません。jvm1 の Web アプリ A で処理された要求は、jvm2 の Web アプリ B に送られ、その逆も同様です。ここで何が欠けているのか、どうすれば問題を解決できるのか教えてください

4

1 に答える 1

1

あなたが観察した動作は妥当に思えます: リクエストを Apache ロード バランサーに送信すると、ノードの 1 つにルーティングされます。あなたのシナリオを正しく理解していれば、(Web アプリによって開始された) 要求が正しいノードにルーティングされるようにする必要があります。これを実現するには、次の 2 つの方法が考えられます。

  1. Web アプリ A に到達する最初の要求は、セッションを所有しているユーザーからのものだと思います。Tomcat でスティッキー セッションを構成している場合は、ユーザーのセッション Cookie を再利用して、Web サービス リクエストと一緒に送信できます。このようにして、ロードバランサーは、Cookie をもたらした元のリクエストと同じノードにリクエストをルーティングすることを決定します。しかし、Web サービスを呼び出した場所から Cookie にアクセスすることは現実的ではないかもしれません。
  2. 内部要求を処理することは、ロード バランサーの仕事ではありません。では、なぜそれを使用するのでしょうか。両方の Tomcat 構成に通常の HTTP コネクタを追加し、代わりにそれらを Web サービス要求に使用することができます。したがって、ロード バランシングを回避できますが、この場合、不要なレイテンシとオーバーヘッドが通信に追加されるだけです。欠点は、おそらく呼び出す IP をハードコーディングする必要があることです。

ところで: あなたの構成は、ノードとロード バランサーの両方が 1 台のマシンで実行されているように見えます。それについてよろしいですか?

于 2012-12-27T14:44:51.517 に答える