Lazyタイムアウト分解能の回路ブレーカーが投げArgumentOutOfRangeException
-
19-09-2019 - |
質問
Ayende掲載 修正 にDavy Brionの 漏電ブレーカー, 記代には、タイムアウトの決議は、lazyモデルです。
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();
}
しかし、 コンストラクタに失敗する が TimeSpan
できオーバーフローの最大値の DateTime
.例えば、回路ブレーカーのタイムアウトの最大値は揃.
システム。ArgumentOutOfRangeExceptionで獲れた
メッセージ="を追加または減算値からの連representable DateTime."
...
です。DateTime.op_Addition(DateTime d揃t)
どうしてこの問題を回避するための想定的に振る舞えるのでしょうか?
解決
ちょっとしたビットの数
する場合 タイムアウトにより、残り の最大値の DateTime
現在の DateTime
.最大 TimeSpan
通常ことを示し 機能無限のタイムアウト (これを"一時的"回路ブレーカー).
public OpenState(CircuitBreaker outer)
: base(outer)
{
DateTime now = DateTime.UtcNow;
expiry = outer.Timeout > (DateTime.MaxValue - now)
? DateTime.MaxValue
: now + outer.Timeout;
}
所属していません StackOverflow