1

Ayende はDavy Brion のcircuit breakerに修正を投稿し、タイムアウト解決を遅延モデルに変更しました。

private readonly DateTime expiry;

public OpenState(CircuitBreaker outer)
    : base(outer)
{
    expiry = DateTime.UtcNow + outer.timeout;
}

public override void ProtectedCodeIsAboutToBeCalled()
{
    if(DateTime.UtcNow < expiry)
        throw new OpenCircuitException();

    outer.MoveToHalfOpenState();
}

ただし、 aが a の最大値をすぐにオーバーフローする可能性があるため、コンストラクターが失敗する可能性があります。たとえば、サーキット ブレーカーのタイムアウトが TimeSpan の最大値である場合です。TimeSpanDateTime

System.ArgumentOutOfRangeException がキャッチされました

Message="加算または減算された値は、表現できない DateTime になります。"

...

System.DateTime.op_Addition (DateTime d、TimeSpan t) で

この問題を回避し、期待される動作を維持するにはどうすればよいでしょうか?

4

1 に答える 1

2

少し計算してみよう

タイムアウトがa の最大値と現在のの残りより大きいかどうかを判断します。通常、最大値は機能的に無限のタイムアウトを示します(これを「1 回限りの」サーキット ブレーカーにします)。DateTimeDateTimeTimeSpan

public OpenState(CircuitBreaker outer)
    : base(outer)
{
    DateTime now = DateTime.UtcNow;
    expiry = outer.Timeout > (DateTime.MaxValue - now) 
        ? DateTime.MaxValue
        : now + outer.Timeout;
}
于 2010-01-11T17:24:52.187 に答える