Apply Circuit Breaker アサーション

Apply Circuit Breaker アサーションでは、エラー条件のしきい値を定義し、それを超過した場合、ユーザが設定した期間中にポリシー ブロックの実行を停止します。これは、低速または異常なバックエンド システムによって発生するリクエストの処理速度の低下によるボトルネックを回避するのに最適です。
gateway93
Apply Circuit Breaker アサーションでは、エラー条件のしきい値を定義し、それを超過した場合、ユーザが設定した期間中にポリシー ブロックの実行を停止します。これは、低速または異常なバックエンド システムによって発生するリクエストの処理速度の低下によるボトルネックを回避するのに最適です。
これは、All Assertions Must Evaluate to True アサーションと同じように動作する複合アサーションです。主な違いは、失敗の履歴(ポリシーの失敗または最大遅延の超過)を記録する内部イベント トラッカです。Apply Circuit Breaker アサーションで回路がしきい値を超過したことが検出されると、アサーションは失敗し、その子アサーションは実行されません。周辺のポリシー ロジックに応じて、Apply Circuit Breaker アサーションの失敗によってさらに分岐が発生するか、またはポリシー全体が失敗します。
このアサーションでは、以下の一方または両方の回路を有効にできます。
  • Policy Failure Circuit:
    この回路は、特定のサンプリング ウィンドウ(たとえば、「過去 5 秒間」)内に特定の数の子ポリシー失敗が発生すると切断されます。回路が切断されると、Apply Circuit Breaker アサーションは「Falsified」を返します。リカバリ期間中は、以降のリクエストに対する子アサーションは処理されません。
  • Latency Circuit:
    この回路は、特定数の遅延失敗後に切断されます。遅延失敗は、子アサーションの実行時間がしきい値を超えた場合に発生します。
Policy Failure Circuit と Latency Circuit はそれぞれ独立しています。いずれかの回線が切断されると、アサーションは失敗します。
このアサーションの複数のインスタンスをポリシー内に設定できます。各回路は、(共有するカスタム イベント トラッカを定義する場合を除いて)失敗の独自の内部イベント トラッカを保持します。
目次
このアサーションは、以下と比較します。
  • All Assertions Must Evaluate to True アサーション: どちらのアサーションも、1 つが失敗するまで各子アサーションを処理します。「All Assertions...」は、各リクエストを同じように処理します。バック エンドのタイムアウトなどによりある子アサーションが継続的に失敗した場合、すべての以前の子アサーションが不必要に処理されます。Apply Circuit Breaker アサーションは失敗を追跡します。しきい値を超えると、アサーションは「falsified」を返し、事前定義済みのリカバリ期間中は子アサーション処理がブロックされます。
  • Apply Rate Limit アサーション: このアサーションは、事前定義済みのレートを超過した場合にリクエストをスロットル制御できますが、ポリシーのブロックをスキップすることはできません。
  • 分岐ロジック: Run All Assertions Concurrently アサーションなど、その他の複合アサーションを使用して分岐ロジックを設定できます。また、分岐ロジックは、特定の条件下でポリシー ブロックの実行を回避できます。Apply Circuit Breaker アサーションは、ポリシー失敗回路および遅延回路を定義することによってこの機能を拡張します。
コンテキスト変数
なし
クラスタ プロパティ
プロパティ
説明
circuitBreaker.eventTrackerCleanupInterval
イベント トラッカ クリーンアップ間隔。間隔ごとに、その間隔より前の失敗レコードがイベント トラッカから削除されます(たとえば、デフォルト値の 10 分ごとを使用する場合、10 分より前の失敗が削除されます)。
デフォルト:
600000
ミリ秒(10 分)
クリーンアップの周期は、最大サンプリング ウィンドウのサイズの 2 倍以上にする必要があります。そのようにしない場合、サンプリング ウィンドウ内でクリーンアップ対象のイベントによって回路が切断する前に、失敗の回数が予想外になる可能性があります。
circuitBreaker.forceCircuitOpenEventTrackerIdList
イベント トラッカ ID のリスト(この ID を使用する回路を即座に開きます)。子アサーションは実行されません。
このクラスタ プロパティは、「短絡」リストのように動作します。
デフォルト: リストは空
監査
監査 ID
Level
メッセージ
11500
WARNING
{0} Circuit tripped; open until {1}
Policy Failure Circuit tripped; open until 12:01:12.1432
11501
INFO
This {0} Circuit is forced open based on its Event Tracker ID: {1}
This Latency Circuit is forced open based on its Event Tracker ID: MyBackendService-Latency
11502
WARNING
Value for {0} Circuit {1} is invalid: {2}
Value for Policy Failures Circuit Sampling Window is invalid: -200
11503
INFO
{0} Circuit open until {1}
Policy Failure Circuit open until 12:01:12.1432
Latency Circuit open until 12:01:12.1432 for Event Tracker ID 'MyBackendService-Latency'
 
プロパティ
設定
説明
Policy Failure Circuit:
このオプションを有効にすると、アサーションは子ポリシー失敗に応答します。
Max Failures
サンプリング ウィンドウ内にアサーションがこの回数だけ失敗をカウントすると、回路は「切断」されます。切断されると、アサーションはリカバリ期間にわたって失敗します(「Falsified」を返します)。
Sampling Window
失敗は、直近のこの期間のみにわたってカウントされます。デフォルトは
5000
ミリ秒です。
Recovery Period
回路が「切断」されると、アサーションはこのリカバリ期間にわたって失敗します。この間、子アサーションは処理されないため、失敗はそれ以上カウントされません。リカバリ期間が経過すると、アサーションは再び子アサーションの処理を許可します。デフォルトは
10000
ミリ秒です。
前のポリシー失敗が将来の回路失敗計算でもう一度カウントされるのを防ぐために、リカバリ期間をサンプリング ウィンドウより大きく設定します。
Event Tracker ID
この回線に独自のイベント トラッカ識別子を割り当てるには、このオプションを有効にします。コンテキスト変数を指定して、動的な回線を作成することができます。
詳細については、後述の「カスタム イベント トラッカについて」を参照してください。
Latency Circuit:
このオプションを有効にすると、アサーションは遅延失敗に応答します。「遅延失敗」は、子アサーションの処理時間が定義済みの遅延しきい値を超えた場合に発生します。 
Max Failures
Sampling Window
Recovery Period
これらの設定は、「Policy Failure Circuit」と同じように動作します。
リカバリ期間をサンプリング ウィンドウより大きくすることに関するヒントは、ここでも適用されます。
Max Latency
これは、遅延しきい値です。Gateway では、すべての子アサーションを処理するのにかかった時間を追跡します。最大遅延を超えた場合、遅延失敗としてカウントされます。
Event Tracker ID
この設定は、「Policy Failure Circuit」と同じように動作します。
カスタム イベント トラッカについて
デフォルトでは、Apply Circuit Breaker アサーションはカスタム イベント トラッカを設定しません。各回路は、独自の内部イベント トラッカを使用して失敗イベントを追跡します。カスタム イベント トラッカを作成することにより、回路ベースの高度な動作を有効にできます。
イベント トラッカの共有
同じカスタム イベント トラッカ ID を使用するように設定することにより、回路間でイベント トラッカを共有できます。同じイベント トラッカを参照することにより、2 つ以上の回路は、独立したしきい値とリカバリ期間を維持しながら、失敗イベント履歴を共有できます。このシナリオでは、回路が同じしきい値とリカバリ期間を使用する場合、それらは回路の状態も共有します。イベント トラッカの共有により、Gateway のサービスは、類似するエラーの検出ポイントを複数持つことができます。たとえば、特定のデータ センター内の複数のサービスにルーティングする場合の遅延を、回路切断用の共通のしきい値に集約できます。
動的回路
カスタム イベント トラッカ ID でコンテキスト変数を使用するように Apply Circuit Breaker アサーションを設定することで、実行時に動的な回路を作成できます。これらの動的な回路は同じポリシー ブロックに適用されますが、異なるイベント トラッカを持っているため、それぞれの失敗イベント履歴と回路の状態は異なります。この機能により、異なる Apply Circuit Breaker アサーションはそれぞれ、ネストされているポリシーを一部のリクエストに対して実行し、他のリクエストに対しては実行されないようにできます。これより、よりきめ細かいコンテキスト対応型のエラー処理が実現されます。
例:
Gateway に公開されたサービスでは、Route via HTTP(S) アサーションを使用して API にリクエストを送信します。このアサーションは、[Policy Failure Circuit]が有効にされた Apply Circuit Breaker アサーション内にネストされます。サービスへのリクエストでは、ヘッダとして API キーを提供する必要があります。サービスを利用するすべての開発者には、独自の API キーが割り当てられます。
カスタム イベント トラッカがないと、任意の開発者が加えた変更によって API への Gateway HTTP リクエストが失敗した場合、それはポリシー失敗としてカウントされます。Policy Failure Circuit が切断されると、リクエストは成功していても、すべての開発者へのルーティングが停止します。
この予想外の結果を防ぐには、ヘッダで送信される API キーに基づいてカスタム イベント トラッカ ID を設定します(たとえば、
${request.http.header.apikey}
)。これにより、API キーごとに実行時に別個の回路が作成されます。ブロックされるのは、失敗リクエストを送信する開発者のみです。これは、その開発者の API キーに関連付けられた回路のみが切断されるためです。
よくある質問
質問
回答
自分のポリシーに複数の回路ブレーカ アサーションを追加できますか。
可能です。Apply Circuit Breaker アサーションのインスタンスごとに 1 つまたは複数の回路を定義できます。たとえば、最初のアサーションで子ポリシー実行失敗しきい値を定義し、2 番目のアサーションで遅延制限しきい値を定義し、3 番目で両方を定義できます。
回路ブレーカは、クラスタ全体にわたって適用されますか。
いいえ、Apply Circuit Breaker アサーションはノード単位で適用されます。
両方の回路を有効にした場合はどうなりますか。
アサーション内でポリシー失敗回路と遅延回路の両方を有効にした場合、いずれかの回路が切断するとアサーションが短絡します。同じアサーション実行で両方のタイプの失敗が発生した場合、両方の失敗が記録されます。
両方の回線を無効にした場合はどうなりますか。
アサーションを一時的に「オフにする」必要がある場合は、両方の回線を無効にできます。この場合、すべての子アサーションが実行され、Apply Circuit Breaker アサーションではポリシー失敗または遅延失敗がカウントされません。
ポリシー失敗回路が「切断」されると、どのような応答が返されますか。
最後に実行された子アサーションから受信したステータスがサービスによって返されます。リカバリ期間中は、アサーションによって「Falsified」が返されます。
Raise Error アサーションを子アサーションとして追加しました。なぜこれはポリシー エラーとしてカウントされないのですか。
Raise Error アサーションの処理が行われた場合、これは失敗ではありません。このアサーションは成功です。Apply Circuit Breaker アサーションでは、All Assertions Must Evaluate to True アサーションと同じ方法で Raise Error を扱います。