我们的同事已经展示了断路器的优势,所以我将专注于实际示例。
所以,看看你的例子,你有一个必须调用支付 API 的流程>让我们假设它是一个“外部”组件。如果没有这个电话,整个流程可能不能被视为“成功完成”(我知道您有一些在线流程,其中付款是其基本步骤之一)。
在这种情况下,断路器确实可能不会那么有用,除非作为后备,您将支付命令存储在某种中间存储中,然后“重新应用”支付逻辑。
断路器的全部意义在于提供合理的回退,以便在应用回退逻辑时不会将流程视为失败。
这是断路器更有意义的另一个示例。
如果您构建了一个“类似 netflix”的门户,并且在 UI 中有一个显示“推荐”电影的小部件。推荐引擎会考虑您以前看过/喜欢的电影。从技术上讲,这是一个“外部系统”/微服务。
现在,如果填充 UI 数据的流程无法获得推荐(例如,如果推荐服务关闭),您会“失败”整个流程吗?可能不会,也许最好显示一些推荐电影的“通用列表”并让用户继续使用该应用程序。
在这种情况下,断路器可以是实现对外部推荐服务的调用的不错选择。
现在,这个流程和异常处理有什么区别?
如果该推荐系统失败的原因是一些临时网络中断/数据库缓慢,那么最好给这个服务一些时间而不是试图一遍又一遍地调用它,我们应该给它一个“恢复”的机会'。当我们应用断路器时,在“开路”期间,我们的代码甚至不会尝试调用服务器,而是直接路由到回退方法。
另一方面,常规的 try/catch 块将始终调用推荐服务。
总而言之,断路器是问题中所述的容错模式;它是一种可以在某些情况下适用的工具,而在其他情况下则无关紧要。