在Elasticsearch.Net或者NEST客户端中,System.DateTime.UtcNow被抽象并封装到了IDateTimeProvider接口中了。这样做的好处是允许我们在做超时或者集群故障转移等单元测试时不用直接调用System.DateTime.UtcNow来获取时间,如下:
var dateTimeProvider = DateTimeProvider.Default;
dateTimeProvider.Now().Should().BeCloseTo(DateTime.UtcNow);
可以看到,我们可以从IDateTimeProvider的默认实现中返回UTC的时间。
该接口(IDateTimeProvider)的另一个职责是根据试图恢复节点的次数计算节点必须退出循环的时间。
对于高级的使用场景,你也可以根据自己的需求实现自定义的时间提供程序。
默认的超时计算算法为:
min(timeout * 2 ^ (attempts * 0.5 -1), maxTimeout)
默认的超时时间(timeout)和最大超时时间(maxTimeout)为:
var timeout = TimeSpan.FromMinutes(1);
var maxTimeout = TimeSpan.FromMinutes(30);
超时时间的代码算法为:
var dateTimeProvider = DateTimeProvider.Default;
var timeouts = Enumerable.Range(0, 30)
.Select(attempt => dateTimeProvider.DeadTime(attempt, timeout, maxTimeout))
.ToList();
foreach (var increasedTimeout in timeouts.Take(10))
increasedTimeout.Should().BeWithin(maxTimeout);
发表评论
登录用户才能发表评论, 请 登 录 或者 注册