Ayende 发布了对 Davy Brion断路器的修改,其中他将超时分辨率更改为惰性模型。
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();
}
但是,构造函数可能会失败,因为 aTimeSpan
可以快速溢出 a 的最大值DateTime
。例如,当断路器的超时是 TimeSpan 的最大值时。
System.ArgumentOutOfRangeException 被捕获
Message="添加或减去的值导致无法表示的日期时间。"
...
在 System.DateTime.op_Addition(DateTime d, TimeSpan t)
我们如何避免这个问题并保持预期的行为?