API 架构中断路器设计模式的优势是什么?

What is advantage of circuit breaker design pattern in API architecture?

很抱歉,如果这个问题不适合 SO。

但我试着找了很多答案。

我正在研究断路器设计模式,据我了解它用于使您 API 容错。现在我感到困惑的是,

假设我有 API 调用付款 api,假设我将电路配置为在 5 次调用连续失败时打开。

现在根据断路器设计,我会将打开电路后的后续调用路由到回退方法。让我们说接下来的 5 个电话,在第 6 个电话上,我将拨打付款电话 API 如果 api 在线,我将关闭电路。

但我没有发现这种模式有任何优势,比如 catch 块和断路器之间的区别。

我们可以在回退方法中做什么?这有什么帮助?

此设计模式的目标是封装处理意外重复错误的逻辑。

此模式的 wikipedia page 有一些有用的部分解释了您希望实现此逻辑以避免发出您预期会失败的请求的情况类型。

What is the advantage of this pattern

当您 运行 知道服务将不可用并且希望自定义行为直到服务恢复联机时,此模式非常有用。例如,在数据库迁移期间,在迁移完成之前将请求断路到队列中是有意义的。

What is difference between catch block and circuit breaker

我认为这个区别是概念和实现的区别。检测是否存在您想要 "open the circuit" 的情况可能意味着检测 catch 块中的错误并对其进行计数,如您的示例所示。但是,处理不仅限于错误。

在我的示例中,后端可能会通知前端即将发生迁移,导致前端出现 "open circuit",直到它收到迁移完成消息。

确实大量使用断路器来实现 API 容错。

Like what is difference between catch block and circuit breaker.

catch 块和断路器之间的主要区别在于故障情况的处理。 假设我们正在调用外部系统的 api。 比方说,api 调用失败。

  1. 如果我们使用 catch 块,我们将捕获异常并调用回退方法。 下次我们将调用相同的 api 并且外部系统仍然关闭。因此,同样的事件循环将再次发生。 这将不必要地轰炸受苦的外部系统,消耗系统资源并增加您的 api 响应时间。

  2. 如果我们使用断路器模式,那么我们的第一次调用失败然后我们打开电路。下次我们连外部系统都不调用了,直接fallback模式。瞧,一切都处理好了!

And what can we do in fall back method? How can this help?

后备方法的一个很好的例子如下。 我们有一个支付系统,可以将支付路由到不同的支付网关。 假设我们从特定支付网关收到错误,然后在后备方法中我们可以将其路由到不同的支付网关。

您还可以阅读本文以了解有关此主题的更多信息:https://martinfowler.com/bliki/CircuitBreaker.html

我们的同事已经展示了断路器的优点,所以我将专注于实际示例。

因此,查看您的示例,您有一个必须调用付款的流程 API> 让我们假设它是一个 "external" 组件。如果没有这个调用,整个流程可能不能被视为 "successfully completed"(我知道您有一些在线流程,其中付款是其基本步骤之一)。

在这种情况下,断路器确实可能不会那么有用,除非作为后备,您将支付命令存储在某种中间存储中,然后 "re-apply" 支付逻辑。

断路器的全部意义在于提供合理的回退,以便在应用回退逻辑时不会将流程视为失败。

这是断路器更有意义的另一个例子。

如果您构建了一个 "netflix-like" 门户并且在 UI 中有一个显示 "recommended" 电影的小部件。推荐引擎会考虑您之前看过/喜欢的电影。从技术上讲,这是一个 "external system"/微服务。

现在,如果为 UI 填充数据的流程无法获得推荐(例如,如果推荐服务已关闭),您会 "fail"整个流程? 可能不会,最好显示一些 "generic list" 推荐的电影并让用户继续使用该应用程序。

在这种情况下,Circuitbreaker可以成为实现调用外部推荐服务的一个很好的选择。

现在,这个流程和异常处理有什么区别?

如果该推荐系统失败的原因是一些临时网络中断/数据库缓慢,可能最好给这个服务一些时间而不是一遍又一遍地尝试调用它,我们应该给它有机会 'recuperate'。 当我们应用断路器时,在 "open-circuit" 期间我们的代码甚至不会尝试调用服务器,直接路由到 fallback 方法。

另一方面,常规 try/catch 块将始终 调用推荐服务。

总而言之,断路器是问题中所述的容错模式;它是一种在某些情况下适用而在其他情况下无关紧要的工具。