この記事では、Camelフレームワークとその2つのコンポーネントであるHTTPとAHCを使用して実装された最も単純なサービスの動作を比較します。構造を掘り下げてフレームワーク自体を操作することはしません。読者はすでにフレームワークに少し慣れていることを前提としています。
桟橋コンポーネントからリクエストを受信し、それらを処理する、たとえばログに表示し、http経由で別のサービスを呼び出し、そこからの応答を処理する、たとえばログに書き込む、単純なCamelサービスについて考えます。
テストでは、JMeterスクリプトを使用して、計画された頻度と間隔に従ってサービスを呼び出しました。また、サービスの外部の役割を果たし、5秒の遅延を実行する小さなHttpサービスも使用しました。すべての通信はローカルループ(127.0.0.1)で行われるため、ネットワークの待ち時間は考慮されませんが、比較分析には必要ありません。
HTTPコンポーネント
このセクションでは、HTTP通信の標準HTTPコンポーネントについて説明します。簡単なサービスコード:
from("jetty:http://localhost:8080/test")
.log("receive request body ${body}")
.removeHeaders("CamelHttp*")
.to("http://{{another.url}}")
.log("finish process body ${body}");
注:「CamelHttp」で始まるヘッダーは、Jettyコンポーネントで公開されており、Httpコンポーネントの動作に影響を与える可能性があるため、削除する必要があります。
このサービスの動作をテストするために、25の同時要求を送信するJMeterスクリプトを実行してみましょう。
サンプル |
最小 |
マックス |
エラー% |
25 |
5012 |
7013 |
20.000% |
, 20% 5 25 (Read timed out). , http- 20 . connectionsPerRoute
from("jetty:http://localhost:8080/test")
.log("receive request body ${body}")
.removeHeaders("CamelHttp*")
.to("http://{{another.url}}?connectionsPerRoute=200")
.log("finish process body ${body}");
25 . – jetty-, 200. 4 JMeter:
200
300
300 5 , 5
200 5 , 5
1 JVM 214 , .
:
|
|
200 |
0% |
300 |
34.667% |
300 5 |
71.733% |
200 5 |
0% |
300 , 200 jetty-, 100 jetty, 5 , 10. 34% – 100 .
, – 300 5 , 5 , .. 60 , 200 5 , .
, , , , jetty- .
, jetty-, JVM 1 , Docker- , . .
AHC-
AHC- - Camel HTTP. AsyncHttpClient, () . – http- , , .. 5 . , . :
from("jetty:http://localhost:8080/test")
.log("receive request body ${body}")
.removeHeaders("CamelHttp*")
.to("ahc:http://{{another.url}}")
.log("finish process body ${body}");
, 300 . , http- . JVM:
, . :
|
|
300 5 |
0% |
800 5 |
0% |
1200 5 |
1.533% |
1600 5 |
15.02% |
, , .
, , 1200 1600 http-, - , .
AHC-
AHC-, . :
from("jetty:http://localhost:8080/test")
.log("receive request body ${body}")
.removeHeaders("CamelHttp*")
.setHeader("rand", ()->new Random().nextInt(10000) )
.toD("ahc:http://{{another.url}}?rand=${headers.rand}")
.log("finish process body ${body}");
300リクエストを1回開始してスクリプトを実行した後、JVM内のスレッドの状態は次のようになります。
ご覧のとおり、流れが多すぎます。実際のところ、デフォルトでは、各エンドポイントのAHCコンポーネントは、AsyncHttpClientオブジェクトの独自のインスタンスを作成します。各インスタンスには、独自の接続とスレッドのプールがあります。その結果、リクエストごとに、2つのスレッドが作成されます。1つはI / Oスレッド、もう1つはタイムアウトを制御し、接続をKeepAlive状態に保ちます。これを回避するには、コンポーネントレベルでAsyncHttpClientインスタンスを構成する必要があります。これは、作成時にエンドポイントに渡されます。
AhcComponent ahc = getContext().getComponent("ahc", AhcComponent.class);
ahc.setClient(new DefaultAsyncHttpClient());
その後、多くのAsyncHttpClientインスタンスの作成が停止します。