我有一个web,它与一个C#服务通信,如果它太忙,它会抛出异常。我想限制这个WCF服务的并行调用的数量。
由于web服务在太忙时会迅速抛出异常,因此我希望结合重试来使用舱壁,并且我明确地希望让舱壁首先应用以限制重试策略中等待调用的次数。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);我在这里错过了什么?
发布于 2019-05-17 00:07:07
我发现问题出在哪里了。我为每个请求创建了一个新的舱壁策略,这是错误的。我已经把它更改为只创建一次,这是可行的。
再次阅读文献资料后发现,具体如下:
确定舱壁实例的范围 BulkheadPolicy的一个实例维护通过舱壁执行的操作数量的内部状态:对于通过调用站点执行的每次操作,您必须重用相同的BulkheadPolicy实例,而不是在代码的每次遍历上创建一个新的实例。
https://stackoverflow.com/questions/56158577
复制相似问题