back-pressure と maxConcurrency

負荷が大きい場合、Mule Runtime Engine (Mule) が特定のイベントを処理するために使用可能なリソースがないことがあります。この問題は、すべてのスレッドが使用中で現在のフローの同時実行数を超えている場合に発生します。この場合、Mule は次のメッセージをログに記録します。 ​Flow 'flowName' is unable to accept new events at this time​ (フロー「flowName」は、現在新しいイベントを受け付けられません)。
このメッセージはバックプレッシャーと呼ばれます。Mule のバックプレッシャーアクションは、各コネクタの取得元に固有です。

コンシューマーコンポーネントが情報を処理できるレートより、プロデューサーコンポーネントが情報を出力するレートの方が高い場合は、​maxConcurrency​ パラメーターを使用して、コンポーネントが内部または外部であるか、フローまたはソースであるか、などに応じて、フローが同時に処理できるメッセージの最大数を設定します。

Mule ではバックプレッシャーを独自に適用していますが、​maxConcurrency​ パラメーターを使用することで、特に同時実行数が増える原因がバックエンドサーバーにある場合に、フローのパフォーマンスを制御できます。次の例にパラメーターの設定方法を示します。

<flow name="perf-test-flow" maxConcurrency="${flow.max.concurrency}">

同様に、​maxConcurrency​ パラメーターを次のように使用することで、バッチジョブで処理できるレコード数を制限できます。

<batch:job jobName="test-batch" maxConcurrency="${batch.max.concurrency}">

デフォルトでは、Flow スコープと Async スコープでは ​maxConcurrency​ の制限は設定されていませんが、Batch Job コンポーネントでは使用できるコア数の 2 倍に同時実行数が制限されています。同時実行数は、システムのキャパシティによっても制限されます。

Max Concurrency (最大同時実行) 設定があるコンポーネント

次の​コンポーネント​には最大同時実行の設定があります。

  • Flow スコープ

  • Scatter-Gather ルーター

  • Async スコープ

  • Batch Job スコープ

  • Parallel For Each スコープ

推奨事項

同時実行を減らしてバックプレッシャーイベントを人為的にトリガーする必要がある場合を除き、デフォルト設定を使用してください。また、最大同時実行値を変更しないでください。