我正在try 进行一些HTTP调用,我希望具有重试、超时和隔板功能,以获得最大并发连接数.这是我的try .我不知道这WrapAsync个函数调用的顺序是否正确.更具体地说,

  • 我有时可能会从服务器获得4xx或5xx响应,我希望Polly处理这些响应
  • 我不希望HttpClient发出超过3个并发的HTTP调用,并且我将队列大小设置为"无限"
  • 如果服务器在20秒内没有响应,则该try 超时
  • 对于重试,通过指数增加超时来使用指数超时策略

我的问题是,这段代码是否实现了我所认为的功能?

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));

推荐答案

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

  • escalation chain个词更容易理解:
    • 最左边的参数是最外层的策略
    • 最右边的参数是最内部的策略
  • 它强制执行编译时策略兼容性判断
var resilienceStrategy = Policy.WrapAsync(sharedBulkhead, localRetry, localTimeout); 

我在隔板策略的情况下使用了前缀shared,因为它需要在HttpClient个调用之间共享,否则它是无用的.在Polly的情况下,大多数保单是无国籍的,但有少数stateful个(如断路器或舱壁).

我还建议阅读this other post of mine,其中详细说明了如何在HttpClient的情况下执行限制.长话短说:舱壁主要设计为for CPU based computations,不是为I/O绑定操作设计的.RateLimit政策可能更适合这一点.

Csharp相关问答推荐

将.NET 8程序集加载到Matlab R2023a中时出现问题

如何定义所有项目的解决方案版本?

MongoDB实体框架核心:表达必须可写

我可以 suppress 规则CS 9035一次吗?

ASP.NET MVC中创建视图的过滤器

. NET在上一个操作完成之前,在此上下文实例上启动了第二个操作

FileStream. FlushAsync()是否确保文件被写入磁盘?

如果存在对CodeAnalysis.CSharp的引用,则不能引用netStandard2.0库

如何使用XmlSerializer反序列化字符串数组?

. NET 8控制台应用程序DI错误无法解析Microsoft. Extension. Logging. ILoggerFactory类型的服务'''

C#.NET依赖项注入顺序澄清

使用泛型可空类实现接口

Savagger使用Fastendpoint更改用户界面参数

LINQ to Entities中的加权平均值

关于扩展文件类C#的矛盾

如果是,我怎么才能让这个加75,如果不是,我怎么才能减go 100?

使用动态键从请求体反序列化JSON

我可以强制System.Text.Json.JsonSerializer以非递归方式工作吗?

如何对特定异常使用Polly重试机制?

删除MudRadio时,MudRadioGroup未 Select 正确的MudRadio