Polly:BulkheadPolicy与RetryPolicy相结合

时间:2019-05-15 22:44:52

标签: c# polly

我有一个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);

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

我发现了问题所在。我为每个请求创建了一个新的Bulkhead策略,这是错误的。我已经将其更改为仅创建一次,并且可以正常工作。

再次阅读the documentation后发现,具体是:

  

确定舱壁实例的范围

     

BulkheadPolicy的实例维护数字的内部状态   通过隔板执行的操作的数量:您必须重复使用相同的   通过调用站点执行的BulkheadPolicy实例,而不是通过调用站点   在每次遍历代码时创建一个新实例。