私はApache Camel 2.15を使用しています。 REST API呼び出しで受信したデータを直接エンドポイントであるCamelルートに配置します。このルートは、分割されたEIPを使用し、直接のエンドポイントでもある別のCamelルートを呼び出します。ここでCamel Split EIPとプール内のスレッドの使用がminスレッドを超えていないようです
は、関連するキャメルコードが
from("direct:activationInputChannel").routeId("cbr_activation_route")
// removed some processes
.split(simple("${body}"))
.parallelProcessing()
.to("direct:activationItemEndPoint")
.end()
// removed some processes
と
from("direct:activationItemEndPoint").routeId("cbr_activation_item_route")
.process(exchange -> this.doSomething(exchange))
// removed some processes
呼び出しは同期で、同じスレッドで実行するようになります直接エンドポイントを使用するように見えるものです。 Split/parallelProcessingを使用すると、2番目のルートが別のスレッドで実行されます。スプリッタはデフォルトのスレッドプールを使用しています。
jMeterを使用してアプリケーションに対していくつかの負荷テストを実行したとき、スプリットルートがボトルネックになっていました。 200スレッドを使用した負荷テストでは、Tomcat HTTPスレッドプールがjConsoleにcurrentThreadCount
という200の値を持つことがわかりました。私はまた、キャメルルートcbr_activation_route
が200 ExchangesInflight
を持っていたことを観察した。
問題はcbr_activation_item_route
はわずか50 ExchangesInflight
を有していました。番号50は、デフォルトプールに設定されているpoolSize
に対応しています。 maxPoolSize
は500に設定され、maxQueueSize
は1000(デフォルト)に設定されました。
このルートの機内交換の回数は、最小プールサイズを上回ることはありません。たくさんのリクエストがキューに入れられ、スレッドが利用可能であったにもかかわらず。 CamelのデフォルトスレッドプールのpoolSize
を200に変更したとき、cbr_activation_item_route
は新しい最小値を使用し、200 ExchangesInflight
でした。利用可能なスレッドがさらに多くても負荷がかかっていても、Camelは最小値より多くのスレッドを使用しないようです。
この現象の原因となっている設定や何かがありますか?最小値が50に設定されているときにCamelが最初のテスト実行で200スレッドを使用しないのはなぜですか?
ありがとうございました
「このルートの機内交換の回数が最小プールサイズを超える上昇したことはありません。」私はpoolSizeを200に変更すると、cbr_activation_item_routeには200個のExchangesInflightがありました。 "私にとって何が問題なのかははっきりしていません。 – javamonkey79
最初のテストではCamelプールが50分と500最大スレッドに設定されていました。キャメルが最初のルート(内線交換)で200のアクティブなリクエストを受け取ったとき、スプリットは50分しか使用しませんでした。パフォーマンスがそれほど高くなかったので、スレッド数を増やす必要があったようです。私は分を200に上げ、分割は200回の機内交換を持つことができました。最大500を与えられた私はキャメルがここでもっと多くのスレッドを使うようにするためにminを上げなければならないとは思わなかった。 –
は、上記の質問でこれを明確にしました(うまくいけば)。ありがとうございます。 –