在微服务架构中,每个服务通常管理自己的数据库并独立执行操作。然而,在处理跨越多个微服务的业务流程时,确保这些服务之间的数据一致性成为一项复杂的挑战,特别是当操作需要以原子方式发生时。传统的整体架构可以依赖 ACID 事务,但在分布式系统中,这在规模上是不可行的。
两阶段提交(2PC)协议是一种众所周知的分布式事务解决方案,但由于阻塞、高延迟和单点故障等问题,它在现代大规模系统中被广泛认为低效且不切实际。
我正在处理一个高度分布式的微服务架构,其中多个服务需要参与类似事务的流程(例如,支付服务与库存服务和发货服务交互)。每个服务管理自己的数据库,并且数据库各不相同(例如,某些服务使用 NoSQL,其他服务使用 SQL)。
我需要确保服务之间的一致性,但是:
在不诉诸两阶段提交 (2PC) 的情况下,同时保持高性能和可扩展性,实现跨微服务的分布式一致性的最有效模式或技术是什么?
简短回答:你不能。由于您描述得如此充分,两个微服务与其自己的数据库之间的立即一致性不是一种选择。
不要考虑预防,而要考虑补偿。您暂时接受不一致,但要确保最终您将再次达到一致的状态。
假设您在服务 A 和 B 中都有操作,并且要么必须执行这两个操作,要么必须执行这两个操作,以使系统处于一致的状态。 因此,您在服务 A 中执行操作。如果成功,您在服务 B 中执行操作。如果也成功,则一切顺利。如果不是,您需要在服务 A 中执行补偿操作以恢复原始操作。
至少有两种基本方法可以实现这一点,一种是事件驱动的方法(编排),另一种是命令驱动的方法(编排)。
我个人是事件驱动架构的大力支持者,所以我建议您研究“很棒的 EDA”列表中的所有内容,并从根本上改变您设计系统的方式。我也会插上我自己的谈论这个话题。
为了了解完整情况,您可能还想研究“saga 模式”here 或 here 等内容。还有一些公司声称他们的工具可以帮助您实现此类流程,例如 temporal.io。
最后,关于该主题的一篇很棒的基础论文是 Pat Helland 的“分布式事务之外的生活”。