【发布时间】:2019-08-23 07:58:17
【问题描述】:
我有一个我调用的服务。让我们称之为LookupService。我的客户端应用程序中有以下代码行调用该服务
var resp= serviceClient.Lookup(payLoad);
现在LookupService 已由该服务的所有者配置为每个客户端不允许超过 5 个并发服务调用。除此之外,它们将返回 HTTP 429。
我正在考虑在调用Lookup 方法之前将这个调用注入到检查方法中。大意是:
ICircuitBreaker cb = CircuitBreakerFactory.GetInstance(); //return a retry instance
cb.Break();
var resp= serviceClient.Lookup(payLoad);
到目前为止,我只想在达到最大并发调用数或服务返回 http 代码 429 时暂停并重试。我将在每次调用 Lookup 方法之前注册到内部静态变量并取消注册服务返回时的调用。 但稍后,我将想要实现另一个类,它提供替代的操作路径或使用回退服务。我知道有一个重试模式,但我觉得注册每个呼叫并跟踪正在进行的呼叫以与服务允许的总允许呼叫进行比较,因为我已经知道提前会帮助我在我先发制人地打破电路知道它会失败。
关于这种模式的想法。可行,完美,矫枉过正?
【问题讨论】:
-
让我知道我可以将这个问题发布到哪个板,如果这不是正确的板。
-
如果当前出现调用过多的情况,或者您预见它会在不久的将来发生,那么断路器并不是矫枉过正。否则,如果您想添加它以防万一将来某个时候需要它,这可能是矫枉过正,尽管如果花时间添加它不是问题,那么无论如何添加它是一个很好的试验机会
-
您实际上是如何进行 HTTP 消息传递的?如果可能,您可以访问到该服务器的所有连接都在使用的
ServicePoint或道德上等效的对象,并应用连接限制(例如,对于HttpClient,您可以手动构造HttpClientHandler和设置其MaxConnectionsPerServer属性)
标签: c# .net design-patterns polly circuit-breaker