8.8. Throttler

概要

Throttler は、受信メッセージのフローレートを制限するプロセッサーです。このパターンを使用して、ターゲットエンドポイントがオーバーロードされないように保護することができます。Apache Camel では、throttle() Java DSL コマンドを使用して Throttler パターンを実装できます。

Java DSL の例

フロー速度を毎秒 100 メッセージに制限するには、以下のようにルートを定義します。

from("seda:a").throttle(100).to("seda:b");

必要な場合は、timePeriodMillis() DSL コマンドを使用してフローレートを制御する期間をカスタマイズすることができます。たとえば、30000 ミリ秒あたりのフローレートを 3 つのメッセージに制限するには、以下のようにルートを定義します。

from("seda:a").throttle(3).timePeriodMillis(30000).to("mock:result");

XML 設定の例

以下の例は、XML で前述のルートを設定する方法を示しています。

<camelContext id="throttleRoute" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="seda:a"/>
    <!-- throttle 3 messages per 30 sec -->
    <throttle timePeriodMillis="30000">
      <constant>3</constant>
      <to uri="mock:result"/>
    </throttle>
  </route>
</camelContext>

期間ごとに最大リクエスト数を動的に変更

Camel 2.8 で利用可能 式を使用しているため、値を実行時に調整できます。たとえば、ヘッダーで値を指定できます。実行時に Camel は式を評価し、結果を java.lang.Long 型に変換します。以下の例では、メッセージのヘッダーを使用して、期間ごとの最大リクエスト数を決定します。ヘッダーがない場合、「Throttler」 は古い値を使用します。そのため、値を変更する場合にのみ、ヘッダーを提供することができます。

<camelContext id="throttleRoute" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:expressionHeader"/>
    <throttle timePeriodMillis="500">
      <!-- use a header to determine how many messages to throttle per 0.5 sec -->
      <header>throttleValue</header>
      <to uri="mock:result"/>
    </throttle>
  </route>
</camelContext>

非同期の遅延

Throttler は、ノンブロッキングの非同期遅延 を有効にすることができます。これは、Apache Camel がタスクを今後実行するようにスケジュールすることを意味します。このタスクは、ルートの後半部分 (Throttler の後) の処理を担当します。これにより、呼び出し元スレッドはブロックされず、次の受信メッセージに対応することができます。以下に例を示します。

from("seda:a").throttle(100).asyncDelayed().to("seda:b");
注記

Camel 2.17 から、Throttler はメッセージのフローを改善するための期間に対し、ローリングウィンドウを使用するようになりました。ただし、Throttler のパフォーマンスが向上されます。

オプション

throttle DSL コマンドは、以下のオプションをサポートします。

名前

デフォルト値

説明

maximumRequestsPerPeriod

 

スロットルする期間毎の最大リクエスト数。このオプションは省略不可で、正の数字を指定する必要があります。XML DSL では、このオプションは Camel 2.8 以降は属性ではなく式を使用して設定されます。

timePeriodMillis

1000

Throttler が最大で maximumRequestsPerPeriod メッセージ数を許可する期間 (ミリ秒単位)。

asyncDelayed

false

Camel 2.4: 有効にすると、遅延しているメッセージはスケジュールされたスレッドプールを使用して非同期的に実行されます。

executorServiceRef

 

Camel 2.4: asyncDelay が有効になっている場合に使用される、カスタムスレッドプールへの参照。

callerRunsWhenRejected

true

Camel 2.4: asyncDelayed が有効な場合に使用されます。これは、スレッドプールがタスクを拒否した場合に、呼び出し元スレッドがタスクを実行するべきかどうかを制御します。