現在、私はオーケストレーションエンジンとして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}}")