首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Polly: BulkheadPolicy与RetryPolicy相结合

Polly: BulkheadPolicy与RetryPolicy相结合
EN

Stack Overflow用户
提问于 2019-05-15 22:44:51
回答 1查看 1.1K关注 0票数 2

我有一个web,它与一个C#服务通信,如果它太忙,它会抛出异常。我想限制这个WCF服务的并行调用的数量。

由于web服务在太忙时会迅速抛出异常,因此我希望结合重试来使用舱壁,并且我明确地希望让舱壁首先应用以限制重试策略中等待调用的次数。PolicyWrap的文档说,它通常应该是相反的,但在我的例子中,我需要这样做。

然而,这是行不通的。我正在用40个并发调用运行一个性能测试,它一直在并行地重试所有40个调用。

这是政策定义:

代码语言:javascript
复制
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);

我在这里错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2019-05-17 00:07:07

我发现问题出在哪里了。我为每个请求创建了一个新的舱壁策略,这是错误的。我已经把它更改为只创建一次,这是可行的。

再次阅读文献资料后发现,具体如下:

确定舱壁实例的范围 BulkheadPolicy的一个实例维护通过舱壁执行的操作数量的内部状态:对于通过调用站点执行的每次操作,您必须重用相同的BulkheadPolicy实例,而不是在代码的每次遍历上创建一个新的实例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56158577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档