使用 Polly 断路器处理多项服务的正确方法

Proper way to handle multiple services with polly circuit breaker

我有一个应用程序,我们在其中与数百个 HTTPs 端点进行通信。该应用程序是某种代理。在使用 polly 进行测试时,我注意到如果一个端点,比如 "api.endpoint1.com" 失败,对 "api.endpoint2.com" 和 "api.endpoint3.com" 的调用也将处于 open/blocked 状态。这是有道理的,因为我只定义了一个策略,但是处理这种情况的推荐方法是什么,这样对不相关端点的调用就不会因为另一个端点出现性能问题而被阻止?

我是否创建一组策略,每个端点一个,或者有没有办法提供各种上下文键(即主机名)以将故障范围限定到给定的主机端点?

我已经查看了有关上下文键的 Polly's docs,看起来这些是来回交换数据的一种方式,而不是我在这里寻找的方式。

var policy = Policy
            .Handle<TimeoutException>()
            .CircuitBreaker(1, TimeSpan.FromSeconds(1));

//dynamic, large list of endpoints. 
var m = new HttpRequestMessage(HttpMethod.Post, "https://api.endpoint1.com")
{
    Content = new StringContent("some JSON data here", Encoding.UTF8,"application/json")
};


policy.Execute(() => HTTPClientWrapper.PostAsync(message));

是的,最好的办法是为每个端点创建一个单独的策略。这比针对每个主机执行此操作要好,因为端点可能由于特定于该端点的原因(例如,存储过程很慢)而响应缓慢。

我使用了一个 Dictionary<string, Policy>,端点 URL 作为键。

if (!_circuitBreakerPolices.ContainsKey(url))
{
    CircuitBreakerPolicy policy = Policy.Handle<Exception>().AdvancedCircuitBreakerAsync(
        onBreak: ...
    );
    _circuitBreakerPolicies.Add(url, policy);
}
await _circuitBreakerPolicies[url].ExecuteAsync(async () => ... );