我有一个C#API,可以与Web服务通信,如果太忙,该服务会引发异常。我想限制对此WCF服务的并行调用数。
由于Web服务在太忙时会迅速引发异常,因此我想将Bulkhead与重试结合使用,并且我明确希望首先应用Bulkhead来限制重试策略中等待的呼叫数。 PolicyWrap的文档说,通常应该采用相反的方法,但就我而言,我需要这样。
但是,它不起作用。我正在对40个并发调用进行性能测试,并且它会不断重试所有40个并行调用。
这是策略定义:
var retryPolicy = Policy.HandleResult<wcfResponse>(r => !r.IsSuccessStatus())
.Or<TimeoutException>()
.Or<CommunicationException>()
.WaitAndRetryAsync(60, i => TimeSpan.FromSeconds(1),
// setting maxParallel to 1 and a large queue,
// so I only expect one call to be retrying at the same time.
// However, it is doing all 40 calls in parallel,
// the bulkhead seems to be ignored and the retry policy
// kicks in for all requests in parallel.
var bulkHeadPolicy = Policy.BulkheadAsync(1, 100);
return bulkHeadPolicy.WrapAsync(retryPolicy);
我在这里想念什么?
答案 0 :(得分:1)
我发现了问题所在。我为每个请求创建了一个新的Bulkhead策略,这是错误的。我已经将其更改为仅创建一次,并且可以正常工作。
再次阅读the documentation后发现,具体是:
确定舱壁实例的范围
BulkheadPolicy的实例维护数字的内部状态 通过隔板执行的操作的数量:您必须重复使用相同的 通过调用站点执行的BulkheadPolicy实例,而不是通过调用站点 在每次遍历代码时创建一个新实例。