サーキット ブレーカー機能に Hystrix を使用していますが、必要な基準が満たされたときにブレーカーがすぐに作動しないことに気付きました。
たとえば、次の構成を使用します。
withCircuitBreakerRequestVolumeThreshold(2),
withCircuitBreakerErrorThresholdPercentage(50)
次の一連のコマンドを同期的に実行すると (C1 ~ C3 が同じ CommandKey を持っていると仮定します)、C3 は予期しない動作をします。
// C1: Execute no-op command -- Error threshold 0%, Volume threshold 1
// C2: Execute exception throwing command -- Error threshold 50%, Volume threshold 2
// ---- Breaker should be tripped ----
// C3: Execute no-op command -- This command executes! But the circuit should be tripped!
私が見つけたのは、HystrixCommandMetrics
C3 の前HealthMetrics
に、ローリング ウィンドウでコマンドが実行されていないことを確認した場合です。
ただし、C3 の前に を追加するとThread.Sleep(2_000)
、メトリクスは期待どおりに表示され、C3 は期待どおりに失敗しますFailureType.SHORTCIRCUIT
。
Hystrix のメトリックは「ライブ」ではありませんか? つまり、それらは別のスレッドで管理されていますか? この場合、サーキット ブレーカーがすぐに落ちるとは思わない方がよいでしょう。
フォローアップとして、メトリックを強制的にライブにする方法はありますか?