微服务架构中如何在不使用2PC的情况下实现分布式事务一致性?

问题描述 投票:0回答:1

在微服务架构中,每个服务通常管理自己的数据库并独立执行操作。然而,在处理跨越多个微服务的业务流程时,确保这些服务之间的数据一致性成为一项复杂的挑战,特别是当操作需要以原子方式发生时。传统的整体架构可以依赖 ACID 事务,但在分布式系统中,这在规模上是不可行的。

两阶段提交(2PC)协议是一种众所周知的分布式事务解决方案,但由于阻塞、高延迟和单点故障等问题,它在现代大规模系统中被广泛认为低效且不切实际。

我正在处理一个高度分布式的微服务架构,其中多个服务需要参与类似事务的流程(例如,支付服务与库存服务和发货服务交互)。每个服务管理自己的数据库,并且数据库各不相同(例如,某些服务使用 NoSQL,其他服务使用 SQL)。

我需要确保服务之间的一致性,但是:

  • 2PC 不是一种选择,因为它在性能、可靠性和可扩展性方面存在局限性。
  • 服务必须保持松散耦合,依赖性最小。
  • 该架构必须能够适应任何参与服务的网络故障、崩溃或部分故障。

在不诉诸两阶段提交 (2PC) 的情况下,同时保持高性能和可扩展性,实现跨微服务的分布式一致性的最有效模式或技术是什么?

microservices distributed-transactions event-driven-design
1个回答
0
投票

简短回答:你不能。由于您描述得如此充分,两个微服务与其自己的数据库之间的立即一致性不是一种选择。

不要考虑预防,而要考虑补偿。您暂时接受不一致,但要确保最终您将再次达到一致的状态。

假设您在服务 A 和 B 中都有操作,并且要么必须执行这两个操作,要么必须执行这两个操作,以使系统处于一致的状态。 因此,您在服务 A 中执行操作。如果成功,您在服务 B 中执行操作。如果也成功,则一切顺利。如果不是,您需要在服务 A 中执行补偿操作以恢复原始操作。

至少有两种基本方法可以实现这一点,一种是事件驱动的方法(编排),另一种是命令驱动的方法(编排)。

我个人是事件驱动架构的大力支持者,所以我建议您研究“很棒的 EDA”列表中的所有内容,并从根本上改变您设计系统的方式。我也会插上我自己的谈论这个话题

为了了解完整情况,您可能还想研究“saga 模式”herehere 等内容。还有一些公司声称他们的工具可以帮助您实现此类流程,例如 temporal.io

最后,关于该主题的一篇很棒的基础论文是 Pat Helland 的“分布式事务之外的生活”。


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.