【问题标题】:What is advantage of circuit breaker design pattern in API architecture?API架构中断路器设计模式的优势是什么?
【发布时间】:2019-02-19 23:06:39
【问题描述】:

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

但我试着寻找很多答案。

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

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

现在根据断路器设计,我将在打开电路后将后续调用路由到回退方法。假设接下来 5 次调用,在第 6 次调用时,如果 api 在线,我将调用支付 API,我将关闭电路。

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

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

【问题讨论】:

    标签: java spring api hystrix circuit-breaker


    【解决方案1】:

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

    所以,看看你的例子,你有一个必须调用支付 API 的流程>让我们假设它是一个“外部”组件。如果没有这个调用,整个流程可能不能被视为“成功完成”(我知道您有一些在线流程,其中付款是其基本步骤之一)。

    在这种情况下,断路器确实可能不会那么有用,除非您将支付命令存储在某种中间存储中,然后“重新应用”支付逻辑。

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

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

    如果您构建了一个“类似 netflix”的门户,并且在 UI 中有一个显示“推荐”电影的小部件。推荐引擎会考虑您以前看过/喜欢的电影。从技术上讲,这是一个“外部系统”/微服务。

    现在,如果填充 UI 数据的流程无法获得推荐(例如,如果推荐服务关闭),您会“失败”整个流程吗? 可能不会,也许最好显示一些推荐电影的“通用列表”并让用户继续使用该应用程序。

    在这种情况下,断路器可能是实现对外部推荐服务的调用的不错选择。

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

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

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

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

    【讨论】:

    • 很好地解释了@mark。我理解在考虑断路器时你的后备是多么重要。我了解它的策略模式,在消息队列的帮助下,我们在系统中处理了这个。但是您的示例是非常强大的场景。再次感谢您的解释
    【解决方案2】:

    确实,断路器的大量使用用于使 API 容错。

    比如catch块和断路器有什么区别。

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

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

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

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

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

    你也可以通过这篇文章来了解更多关于这个话题:https://martinfowler.com/bliki/CircuitBreaker.html

    【讨论】:

      【解决方案3】:

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

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

      这种模式有什么好处

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

      catch 块和断路器有什么区别

      我认为这种差异是概念和实现之间的差异。检测是否存在要“打开电路”的情况可能意味着检测 catch 块中的错误并对其进行计数,如您的示例所示。但是,处理不仅限于错误。

      在我的示例中,后端可能会通知前端即将发生迁移,从而导致前端出现“断路”,直到收到迁移完成消息。

      【讨论】:

        猜你喜欢
        • 2012-10-05
        • 2020-01-16
        • 1970-01-01
        • 1970-01-01
        • 2011-05-13
        • 1970-01-01
        • 2019-07-20
        • 1970-01-01
        • 2010-12-24
        相关资源
        最近更新 更多