1

サーキット ブレーカー機能に 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!

私が見つけたのは、HystrixCommandMetricsC3 の前HealthMetricsに、ローリング ウィンドウでコマンドが実行されていないことを確認した場合です。

ただし、C3 の前に を追加するとThread.Sleep(2_000)、メトリクスは期待どおりに表示され、C3 は期待どおりに失敗しますFailureType.SHORTCIRCUIT

Hystrix のメトリックは「ライブ」ではありませんか? つまり、それらは別のスレッドで管理されていますか? この場合、サーキット ブレーカーがすぐに落ちるとは思わない方がよいでしょう。

フォローアップとして、メトリックを強制的にライブにする方法はありますか?

4

1 に答える 1

0

HystricCommandMetrics#getHealthCountsは、 を使用して特定のコマンドに指定された期間ごとに 1 回だけ再計算されることがわかりますmetricsHealthSnapshotIntervalInMilliseconds

デフォルトでは、この間隔は 500 ミリ秒です。

追加の注意として、最初にコマンドを呼び出した後、msgetHealthCountsより前に特定のコマンドを呼び出すと、 . metricsHealthSnapshotIntervalInMillisecondsnew HealthCounts(0,0,0)

つまり、ヘルス カウントは、期間が初めて期限切れになるまで、初期化された値を反映します。

于 2016-01-14T20:27:26.807 に答える