我有一个应用程序,我们可以在其中与数百个 HTTP 端点进行通信。该应用程序是某种代理。
在使用 polly 进行测试时,我注意到如果一个端点,比如说api.endpoint1.com
失败,调用api.endpoint2.com
and api.endpoint3.com
也将处于打开/阻塞状态。
这是有道理的,因为我只定义了一个策略,但是处理这种情况的推荐方法是什么,以便对不相关端点的调用不会因为另一个端点出现性能问题而被阻止?
我是否创建一组策略,每个端点一个,或者是否有一种方法提供某种上下文键(即主机名)来将故障范围限制到给定的主机端点?
我已经评论过波莉的文档 https://github.com/App-vNext/Polly/wiki/Keys-And-Context-Data关于上下文键,看来这些是一种来回交换数据的方式,而不是我在这里寻找的。
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 () => ... );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)