2015-10-31 49 views
9

。私は理論的にはConnectionKeepAliveStrategyを使うことができますが、私がこれを知ることができるのは、レスポンス後にのみ適用されるフォームです。接続はアイドル状態です。のApache HttpClientをロードバランシングプール接続

私たちが抱えている問題..

は、ロードバランサを経由して2台のサーバ(A、B)を押す、1つのクライアントを想定します。 サーバの1つがオフラインになると(B)、すべての新しい接続がサーバ(A)に対して確立されます。 他のサーバ(B)がオンラインに戻ると、すべての接続が他のサーバ(A)にあるので、アイドル状態のままです。クライアントがアイドルタイムアウト/キープアライブ以下の接続にアクセスしている間は、これが継続され、Bサーバはアイドル状態になります(別名ゼロ接続)。

私たちは定期的に閉じます(「ランダム化された時間ウィンドウ」内。理想的には、我々はすべての接続が同時にリセットしたくない)ために、すべての持続的な接続を強制do..isたいです。これを行う上での任意の提案?

私たちはHttpClientConnectionManagerを延長し、接続がどれだけ開いているかを追跡してからx時間後に閉じてみましたが、これはうまくいかないようです。私はそれが実際に実際の時間を追跡するために、その不可能を作るなど、確立された接続の1「を使用し」され、HttpClientConnectionは実際には実際の接続ではなく、プロキシで、このプロキシの下のように見えるので、これは推測していますそれらの根底にある接続が確立されている。

思考?

今私は、要求を実行した後、ただ単に1分あたり1接続で HttpRequestBase.abort()と呼んでいます。希望の動作に近いものをいくつか得ることができます。

+0

ロードバランサを制御していますか?たぶん1つの解決策は、粘着性セッションをオフにすることです。 – kuporific

+0

固定セッションはありません。しかし、一度永続接続が作成されると、そのラウンドロビンになります。定期的に持続接続を閉じる必要があるため、lbはサーバー間で再度負荷バランスを取ることができます。 – danomano

+0

このシナリオでは何かをしましたか?私はまさに同じシナリオを持って、それをどう対処するかについての強固なアイデアを探しています。 – jagamot

答えて

2

一つはTTL(生存時間)パラメータを使用して接続の総寿命を制限することができます。

HttpClientBuilder.create() 
     .setConnectionTimeToLive(1, TimeUnit.MINUTES) 
     .build(); 

これは、すべての接続が1分後に更新されるよう強制します。

+0

それはうまくいくでしょうが、クライアントが同時にX接続を確立すると、一度にすべての接続が落ち、再構築され、理想的ではないという欠点があります。タイムウィンドウ内でTTLをランダム化することは、理想的なことです。これは私がやろうとしていることです。 – danomano

+0

いいえ、そうではありません。 HttpClientは、期限切れの接続を事前予防的に退去させません。プールから接続をリースするときに期限切れの接続を受動的に破棄します。 – oleg

+0

ええと、この時点で、私は分ごとに1つの接続を中止するという私のハックに傾いています。 – danomano

3

私はあなたが適切にロードバランサを使用しているとは思いません。

   +--> SA 
C <---> LB <--+ 
       +--> SB 

クライアントはロードバランサへの永続的な接続を持つことができます。 LB<-->SALB<-->SBの接続は、永続的な接続を使用することもできますが、問題ではありません。ロードバランサは、TCP接続だけでなく、そのレイヤでHTTPとルートを理解する必要があります。したがって、同じ持続的接続で2つの着信(LBへの)HTTP要求を2つの別々のサーバーにルーティングできます。

+0

実際、私はLBがLB→(SA、SB)を1回の時間間隔で循環させて、SBが消滅することを保証していて、SB接続を再確立することができると考えています。 )..一方、クライアントはそれを知らないだろう。 – danomano

関連する問題