キャメルフレームワーク:HTTPコンポーネントとAHCコンポーネントの比較

この記事では、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:





  1. 200





  2. 300





  3. 300 5 , 5





  4. 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インスタンスの作成が停止します。








All Articles