提问人:Node.JS 提问时间:8/27/2023 最后编辑:Peter CsalaNode.JS 更新时间:8/28/2023 访问量:77
C# Polly 结合了 http 错误处理程序、重试、隔板和超时,以便在 HttpClient 中使用
C# Polly combining http error handler, retry, bulkhead and timeout to be used inside HttpClient
问:
我正在尝试进行一些 HTTP 调用,并且希望重试、超时和隔板以获得最大并发连接数。这是我的尝试。我不知道函数调用的顺序是否正确。更具体地说,WrapAsync
- 我有时可能会从服务器收到 4xx 或 5xx 响应,我希望 Polly 处理这些
- 我不希望进行超过 3 个并发 HTTP 调用,并且我将队列大小设置为“无限”
HttpClient
- 如果服务器在 20 秒内没有响应,则该尝试超时
- 对于重试,通过指数增加超时来使用指数超时策略
我的问题是,这段代码是否能做我认为它会做的事情?
var betterPolicy = HttpPolicyExtensions.HandleTransientHttpError().OrTransientHttpStatusCode()
.WaitAndRetryAsync(5, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)))
.WrapAsync(Policy.BulkheadAsync(3, int.MaxValue /* queue size */))
.WrapAsync(Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(20)));
var httpClient = new HttpClient(new PolicyHttpMessageHandler(betterPolicy));
答:
2赞
Peter Csala
8/28/2023
#1
在Polly的情况下,有很多方法可以组合/连锁策略。这里我已经演示了最常见的。我强烈建议您使用静态方法,因为:Policy.WrapAsync
- 更容易解释升级链:
- 最左边的参数是最外层的策略
- 最右边的参数是最内部的策略
- 它强制执行编译时策略兼容性检查
var resilienceStrategy = Policy.WrapAsync(sharedBulkhead, localRetry, localTimeout);
我在 Bulkhead 策略的情况下使用了前缀,因为它需要在调用之间共享,否则它毫无用处。在 Polly 的情况下,大多数策略都是无状态的,但也有一些是有状态的(如断路器或隔板)。shared
HttpClient
我还建议阅读我的另一篇文章,其中详细介绍了如何在 .长话短说:Bulkhead 主要用于基于 CPU 的计算,而不是用于 I/O 绑定操作。RateLimit 策略可能更适合于此。HttpClient
评论