0

現在、私はオーケストレーションエンジンとしてCamelを使用しています(HTTPリクエストが受信され、Camelアプリケーションが特定のHTTPメッセージを送信し、応答に基づいて決定を下します)。Camelアプリケーションは、ApacheのTomCat上で実行されています。

テストの一環として、Camelアプリケーションに同時にリクエストを送信し始めています。簡略化されたシナリオは次のとおりです。

 HTTP POST --> Camel --> HTTP GET to server Z
                     <-- 200 ok (this could take up to 5 sec)
           <-- 200 ok

問題:20の同時リクエストを送信すると、すべてが正常に実行されます(すべてのリクエストは、Camelアプリケーションによって正常に処理されます)。

ただし、21個のリクエストを送信すると、次の動作が表示されます。最初の20個のリクエストが処理され、最初のリクエストが最終応答(= 200 ok)を受信した場合にのみ、21番目のHTTPGETリクエストがサーバーZに送信されます。

これは、20のリクエストの場合、すべてが5秒以内に処理されることを意味します。しかし、21のリクエストを送信する場合、10秒ほどかかります(最後のリクエストは5秒後にサーバーZでのみ処理できます)!!

ここで、Camelコードにログを追加しました(HTTP GETメッセージをサーバーZに送信する前後のタイムスタンプ)。これにより、非常に混乱しました。ログ情報によると、Camelは21番目のリクエストをすぐに送信します。(最初のメッセージの200 okの最終応答を待ちませんか?!)

だから、私は疑問に思っています...この21番目のリクエスト(サーバーZへのHTTP GET)はどこで5秒間スタックしますか?なぜ ??これは本当に私の脳を壊しています...

したがって、21番目のリクエストを要約すると次のようになります。

キャメルログ:

  time x           = POST comes in
  time x+some msec = Camel sends HTTP GET to server Z
  time x+10        = Camel receives 200 ok on HTTP GET

Wiresharkで:

  time x           = POST comes in
  time x+5         = Camel sends HTTP GET to server Z
  time x+10        = Camel receives 200 ok on HTTP GET  

注:キャメルコードで次のようにタイムスタンプを出力しています。

    .log("${date:now:yyyyMMdd-HH-mm-ss-SSS} **** Sending HTTP GET message... ****")
    .to("{{serverZ.endpoint}}")
4

1 に答える 1

2

さらに調査した結果、制限要因が見つかりました。ApacheのHTTP共通クライアントには、「MAXTOTALCONNECTIONS」というパラメータがあります。デフォルト値は...20です。

このパラメータを増やした後、私はもはや問題に直面していません。

注:私はSpring Framework(STS)とEclipseIDEを使用しています。私のCamelアプリケーションでは、applicationContext.xmlファイルを次のように調整しました。

<bean id="http" class="org.apache.camel.component.http.HttpComponent">
    <property name="camelContext" ref="camel"/>
    <property name="httpConnectionManager" ref="myHttpConnectionManager"/>
</bean>

<bean id="myHttpConnectionManager" class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
    <property name="params" ref="myHttpConnectionManagerParams"/>
</bean>

<bean id="myHttpConnectionManagerParams" class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
    <property name="defaultMaxConnectionsPerHost" value="1000"/>
    <property name="maxTotalConnections" value="1000"/>    
</bean>
于 2012-05-15T09:57:51.503 に答える