8.11. Hystrix

概要

Camel 2.18 から利用可能です。

Hystrix パターンにより、アプリケーションを Netflix Hystrix と統合することができます。これにより、Camel ルートでサーキットブレーカーを提供することができます。hystrix は、レイテンシーとフォールトトレランスのライブラリーで、以下の目的で設計されています

  • リモートシステム、サービス、およびサードパーティーライブラリーへのアクセスポイントを分離
  • 失敗の連鎖を止める
  • 障害を避けられない複雑な分散システムでの耐障害性を実現

Maven を使用する場合は、Hystrix を使用するために以下の依存関係を pom.xml ファイルに追加します。

<dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-hystrix</artifactId>
      <version>x.x.x</version>
      <!-- Specify the same version as your Camel core version. -->
</dependency>

Java DSL の例

以下は、インラインのフォールバックルートにフォールバックすることで、hystrix エンドポイントが遅い処理から保護されることを示すルートの例になります。デフォルトでは、タイムアウトリクエストは 1000ms であるため、HTTP エンドポイントは素早く応答する必要があります。

from("direct:start")
    .hystrix()
        .to("http://fooservice.com/slow")
    .onFallback()
        .transform().constant("Fallback message")
    .end()
    .to("mock:result");

XML 設定の例

以下は、XML を使用した場合の同じ例になります。

<camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:start"/>
    <hystrix>
      <to uri="http://fooservice.com/slow"/>
      <onFallback>
        <transform>
          <constant>Fallback message</constant>
        </transform>
      </onFallback>
    </hystrix>
    <to uri="mock:result"/>
  </route>
</camelContext>

Hystrix フォールバック機能の使用

onFallback() メソッドは、メッセージを変換したり、Bean などをフォールバックとして呼び出すことができるローカル処理用のものです。ネットワーク経由で外部サービスを呼び出す必要がある場合は、独自のスレッドプールを使用する独立した HystrixCommand オブジェクトで実行される onFallbackViaNetwork() メソッドを使用する必要があります。これにより、最初のコマンドオブジェクトを使い切ることはありません。

Hystrix の設定例

Hystrix には、次のセクションに記載されているように、多くのオプションがあります。以下の例は、実行タイムアウトをデフォルトの 1 秒ではなく 5 秒に設定し、サーキットブレーカーが 5 秒 (デフォルト) ではなく 10 秒待機してから、状態がオープンへ遷移したときにリクエストを再度試行する Java DSL を示しています。

from("direct:start")
    .hystrix()
        .hystrixConfiguration()
             .executionTimeoutInMilliseconds(5000).circuitBreakerSleepWindowInMilliseconds(10000)
        .end()
        .to("http://fooservice.com/slow")
    .onFallback()
        .transform().constant("Fallback message")
    .end()
    .to("mock:result");

以下は、XML を使用した場合の同じ例になります。

<camelContext xmlns="http://camel.apache.org/schema/spring">
<camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:start"/>
    <hystrix>
      <hystrixConfiguration executionTimeoutInMilliseconds="5000" circuitBreakerSleepWindowInMilliseconds="10000"/>
      <to uri="http://fooservice.com/slow"/>
      <onFallback>
        <transform>
          <constant>Fallback message</constant>
        </transform>
      </onFallback>
    </hystrix>
    <to uri="mock:result"/>
  </route>
</camelContext>
 You can also configure Hystrix globally and then refer to that
configuration. For example:
<camelContext xmlns="http://camel.apache.org/schema/spring">
   <!-- This is a shared config that you can refer to from all Hystrix patterns. -->
   <hystrixConfiguration id="sharedConfig" executionTimeoutInMilliseconds="5000" circuitBreakerSleepWindowInMilliseconds="10000"/>

   <route>
         <from uri="direct:start"/>
         <hystrix hystrixConfigurationRef="sharedConfig">
         <to uri="http://fooservice.com/slow"/>
         <onFallback>
            <transform>
               <constant>Fallback message</constant>
            </transform>
         </onFallback>
      </hystrix>
      <to uri="mock:result"/>
   </route>
</camelContext>

オプション

Ths Hystrix コンポーネントは以下のオプションをサポートします。Hystrix はデフォルト値を提供します。

名前デフォルト値説明

circuitBreakerEnabled

true

ブール値

サーキットブレーカーを使用して健全性を追跡し、トリップした場合にはショートサーキットリクエストを使用するかどうかを決定します。

circuitBreakerErrorThresholdPercentage

50

Integer

サーキットがトリップしてオープンになり、フォールバックロジックへのショートサーキットリクエストが開始されるエラーの割合 (パーセント) を設定します。

circuitBreakerForceClosed

false

ブール値

true の値を指定すると、強制的にサーキットブレーカーをクローズ状態にします。そのため、エラーの割合に関係なくリクエストは許可されます。

circuitBreakerForceOpen

false

ブール値

true の値を設定すると、サーキットブレーカーはすべてのリクエストを拒否するオープン (トリップ) 状態になります。

circuitBreakerRequestVolumeThreshold

20

Integer

サーキットをトリップさせるローリングウィンドウの最小リクエスト数を設定します。

circuitBreakerSleepWindownInMilliseconds

5000

Integer

サーキットがトリップした後、リクエストを拒否する時間を設定します。この時間が経過すると、サーキットを再度クローズするかどうかを判断するためのリクエストが試行されます。

commandKey

Node ID

String

Hystrix コマンドを識別します。このオプションは設定できません。コマンドを一意にするのは常にノード ID です。

corePoolSize

10

Integer

コアスレッドプールのサイズを設定します。これは、同時実行可能な HystrixCommand オブジェクトの最大数です。

executionIsolationSemaphoreMaxConcurrentRequests

10

Integer

ExecutionIsolationStrategy.SEMAPHORE を使用する場合に、HystrixCommand.run() メソッドが実行できるリクエストの最大数を設定します。

executionIsolationStrategy

THREAD

String

HystrixCommand.run() と実行される分離ストラテジーを示します。THREAD は別のスレッドで実行され、同時リクエストはスレッドプールのスレッド数によって制限されます。SEMAPHORE は呼び出しスレッドで実行され、同時リクエストは semaphore の数によって制限されます。

executionIsolationThreadInterruptOnTimeout

true

ブール値

タイムアウトの発生時に HystrixCommand.run() の実行を中断するかどうかを示します。

executionTimeoutInMilliseconds

1000

Integer

実行完了までのタイムアウトをミリ秒単位で設定します。

executionTimeoutEnabled

true

ブール値

HystrixCommand.run() の実行のタイミングを調整する必要があるかどうかを示します。

fallbackEnabled

true

ブール値

失敗または拒否が発生した場合に HystrixCommand.getFallback() への呼び出しを試行するかどうかを決定します。

fallbackIsolationSemaphoreMaxConcurrentRequests

10

Integer

HystrixCommand.getFallback() メソッドが呼び出しスレッドから実行できるリクエストの最大数を設定します。

groupKey

CamelHystrix

String

統計情報とサーキットブレーカー のプロパティーを関連付けるために使用される Hystrix グループを識別します。

keepAliveTime

1

Integer

keep-alive 時間 (分単位) を設定します。

maxQueueSize

-1

Integer

BlockingQueue 実装の最大キューサイズを設定します。

metricsHealthSnapshotIntervalInMilliseconds

500

Integer

Health Snapshot を取得できるようにする間隔 (ミリ秒単位) を設定します。Health Snapshot は、成功とエラーの割合を算出し、サーキットブレーカーのステータスに影響を与えます。

metricsRollingPercentileBucketSize

100

Integer

バケットごとに保持される実行回数の最大値を設定します。時間内により多くの実行が発生した場合はラップされ、バケットの先頭から上書きを開始します。

metricsRollingPercentileEnabled

true

ブール値

実行レイテンシーを追跡するかどうかを示します。レイテンシーはパーセント値として計算されます。false を指定すると、サマリー統計 (平均値、パーセント) が -1 として返されます。

metricsRollingPercentileWindowBuckets

6

Integer

rollingPercentile ウィンドウを分割するバケット数を設定します。

metricsRollingPercentileWindowInMilliseconds

60000

Integer

パーセント計算をするために実行時間が保持されるローリングウィンドウの期間 (ミリ秒単位) を設定します。

metricsRollingStatisticalWindowBuckets

10

Integer

ローリング統計ウィンドウを分割するバケット数を設定します。

metricsRollingStatisticalWindowInMilliseconds

10000

Integer

このオプションと以下のオプションは、HystrixCommand および HystrixObservableCommand の実行からメトリックをキャプチャーする場合に適用されます。

queueSizeRejectionThreshold

5

Integer

拒否するためのしきい値をキューへ設定します。maxQueueSize に到達していない場合でも拒否できる人為的な最大キューサイズを設定します。

requestLogEnabled

true

ブール値

HystrixCommand の実行およびイベントを HystrixRequestLog に記録されるべきかどうかを示します。

threadPoolKey

null

String

このコマンドを実行するスレッドプールを定義します。デフォルトでは、グループキーと同じキーを使用します。

threadPoolMetricsRollingStatisticalWindowBucket

10

Integer

ローリング統計ウィンドウを分割するバケット数を設定します。

threadPoolMetricsRollingStatisticalWindowInMilliseconds

10000

Integer

統計ローリングウィンドウの期間をミリ秒単位で設定します。スレッドプール用にメトリクスが保持される期間です。