c# - 使用 polly 断路器处理多个服务的正确方法
问题描述
我有一个应用程序,我们在其中与数百个 HTTPs 端点进行通信。该应用程序是一种代理。在使用 polly 进行测试时,我注意到如果一个端点,比如“api.endpoint1.com”失败,对“api.endpoint2.com”和“api.endpoint3.com”的调用也将处于打开/阻塞状态状态。这是有道理的,因为我只定义了一个策略,但是处理这种情况的推荐方法是什么,这样对不相关端点的调用不会因为另一个有性能问题而被阻止?
我是为每个端点创建一个策略集合,还是有办法提供各种上下文键(即主机名)来将故障范围限定为给定的主机端点?
我已经查看了Polly 的有关上下文键的文档,看来这些是来回交换数据的一种方式,而不是我在这里寻找的方式。
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 的 a 作为键。
if (!_circuitBreakerPolices.ContainsKey(url))
{
CircuitBreakerPolicy policy = Policy.Handle<Exception>().AdvancedCircuitBreakerAsync(
onBreak: ...
);
_circuitBreakerPolicies.Add(url, policy);
}
await _circuitBreakerPolicies[url].ExecuteAsync(async () => ... );
推荐阅读
- javascript - 如何在空闲 Chrome 选项卡中使用强化节流运行 Javascript 计时器
- android - 由于 Hockey SDK 不再存在于代码中,Google 暂停了应用程序
- flutter - Flutter - google_mobile_ads 支持 facebook 受众网络中介与 admob?
- sql - 在同一行上显示分组行中的单个元素
- web - 自动子域创建和重定向
- swiftui - SwiftUI & UIViewRepresentable 不一致的行为:为什么相同的代码在不同的项目中不起作用?
- python - python sqlite查询选择用多个零填充的文本
- node.js - 使用刷新令牌来获取新的访问令牌反应和节点 js
- asp.net - 发送邮件后,消息显示错误:您的查询已成功发送
- django - 返回不带http的图片的url