【问题标题】:Adding Polly Retry policy globally全局添加 Polly 重试策略
【发布时间】:2022-10-19 13:41:18
【问题描述】:

我知道您可以将IAsyncPolicy<HttpResponseMessage> 注册到注入到服务中的HttpClient 的特定实例,但是有没有办法全局配置它,通过微软的依赖注入连接到所有HttpClients?

例如,您可以通过以下方式连接注入MyService 的 HttpClient:

services.AddHttpClient<MyService>(
    .AddPolicyHandler(
        HttpPolicyExtensions
            .HandleTransientHttpError()
            .WaitAndRetryAsync(3, retryAttempt =>
                TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))));

但我想将此策略处理程序添加到所有 HttpClients。我想添加重试的类是第 3 方并标记为内部,所以我不能直接访问它。

【问题讨论】:

  • 您不能,因为无法确定每个客户端的创建方式。但听起来你可能问错了问题。您是否需要一种在全球范围内添加重试的方法,或者您真的只需要一种将它们添加到第三方库的方法?

标签: c# dependency-injection dotnet-httpclient polly retry-logic


【解决方案1】:

简而言之:使用自定义 HttpClientFactory 您可以但不应该以此为目标。

In order to use retry 针对端点应满足所有这些先决条件:

  • 潜在引入的可观察影响是可以接受的
  • 该操作可以重做,没有任何不可逆转的副作用
  • 与承诺的可靠性相比,引入的复杂性可以忽略不计

如果我们谈论的是 REST API,那么以幂等方式实现所有 CRUD 操作是可行的,但要以正确的方式实现这一点非常具有挑战性。所以,大多数时候你想应用重试逻辑只有您的检索电话,而不是针对您的数据操作调用。

另请注意,重试会使事情变得更糟。如果下游系统过载,那么发送新请求将无助于自我修复。很可能它需要一些“空气”才能从退化状态恢复到正常状态。这就是Circuit Breaker 可能有助于避免下游系统在已经遇到困难时泛滥的地方。

您可以通过escalation 组合重试和断路器策略

  • 其中 CB 是内部策略
  • 并且重试是外部的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    相关资源
    最近更新 更多