C# Polly 结合了 http 错误处理程序、重试、隔板和超时,以便在 HttpClient 中使用

C# Polly combining http error handler, retry, bulkhead and timeout to be used inside HttpClient

提问人:Node.JS 提问时间:8/27/2023 最后编辑:Peter CsalaNode.JS 更新时间:8/28/2023 访问量:77

问:

我正在尝试进行一些 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));
C# dotnet-httpclient polly retry-logic policywrap

评论


答:

2赞 Peter Csala 8/28/2023 #1

在Polly的情况下,有很多方法可以组合/连锁策略。这里我已经演示了最常见的。我强烈建议您使用静态方法,因为:Policy.WrapAsync

  • 更容易解释升级链
    • 最左边的参数是最外层的策略
    • 最右边的参数是最内部的策略
  • 它强制执行编译时策略兼容性检查
var resilienceStrategy = Policy.WrapAsync(sharedBulkhead, localRetry, localTimeout); 

我在 Bulkhead 策略的情况下使用了前缀,因为它需要在调用之间共享,否则它毫无用处。在 Polly 的情况下,大多数策略都是无状态的,但也有一些是有状态的(如断路器或隔板)。sharedHttpClient

我还建议阅读我的另一篇文章,其中详细介绍了如何在 .长话短说:Bulkhead 主要用于基于 CPU 的计算,而不是用于 I/O 绑定操作。RateLimit 策略可能更适合于此。HttpClient