微服务架构:SAGA 模式
本文介绍了 Saga 模式的关键概念、类型,并重点比较了协同 Saga 和中心化 Saga 的优缺点。原文:Microservices Architectures: The SAGA Pattern

Saga 模式是一种用于在微服务架构中管理分布式事务的架构模式,能够确保多个服务之间的数据一致性,且无需依赖分布式事务(在微服务环境中,这种依赖可能会变得复杂且效率低下)。
Saga 模式关键概念

在 Saga 模式中,业务流程被分解为一系列局部事务。每个局部事务都会更新数据库,发布事件或消息以触发流程中的下一个事务。这种方法有助于在不同服务间保持数据一致性,确保在进入下一步骤前,之前的步骤都已完成。
Saga 模式类型
Saga 模式存在多种变体,每种变体都适用于不同场景:
基于协同编排的 Saga:每个服务都会监听事件,并根据接收到的事件来决定是否继续执行下一步操作。这种去中心化模式非常适合松耦合的服务。
基于中心化编排的 Saga:由一个被称为“编排器”的中央协调者来管理一系列操作的顺序。这种方法提供了更高的控制级别,并且在需要精确协调的情况下非常有用。
基于状态的 Saga:通过共享状态或状态机来跟踪事务的进展情况。微服务在执行其操作时会更新状态,从而指导后续步骤。
逆向协同编排 Saga:这是基于协同编排 Saga 的扩展,服务会明确就如何弥补失败操作而进行交流。
基于事件的 Saga:微服务会根据系统中发生的变更所生成的事件做出响应,以异步方式执行必要操作或进行补偿。
Saga 模式所解决的问题
Saga 模式解决了分布式事务中多个微服务之间保持数据一致性的问题,解决了微服务架构中的几个关键挑战:
分布式事务:在微服务环境中,单个业务事务通常会涉及多个服务,而每个服务都有其自身的数据库。传统 ACID 事务在这种分布式环境中并不适用。
数据一致性:当无法使用单一原子事务时,要确保不同服务及其数据库之间的数据一致性是一项颇具挑战性的任务。
可扩展性与性能:两阶段提交(2PC)协议常用于分布式事务处理,但在微服务架构中可能会导致性能问题和可扩展性降低。
Saga 模式提供的解决方案
Saga 模式通过以下方式解决了这些问题:
将分布式事务分解为一系列本地事务,每个事务由单个服务处理。
利用补偿事务在流程中的某个步骤失败时撤销更改,以确保最终一致性。
在事务管理方面具有灵活性,允许服务的添加、修改或移除不会对整体事务流程产生显著影响。
通过允许每个服务独立管理其自身的本地事务,提高了可扩展性。
通过提供处理以及从事务故障中恢复的机制,提高了容错能力。
对事务过程的可见性有助于调试、审计和合规性。
实现方法
基于协同编排的 Saga

分布式控制:参与这一进程的每个服务都会监听事件并独立做出反应,而没有中央控制者。
事件驱动通信:服务通过发布和订阅事件来进行通信。
自主性和灵活性:服务可以添加、删除或修改而不会对整个系统产生显著影响。
可扩展性:编排能够更灵活的处理复杂且频繁的交互,使其适用于高度可扩展的系统。
基于中心化编排的 Saga

集中式控制:中央协调者负责管理事务的顺序,指示每个服务在何时执行何种操作。
命令驱动式通信:协调者向服务发送指令以执行特定操作。
可见性和控制:协调者对整个流程拥有全局视角,这使得管理及故障排查更加容易。
协同编排与中心化编排的选择
何时使用协同编排
希望避免出现单一故障点时。
服务需要高度自主且相互独立时。
在不干扰整体流程的情况下添加或移除服务是优先考虑事项时。
何时使用中心化编排
需要确保特定的执行顺序时。
集中控制和可见性对于管理复杂的工作流程至关重要时。
需要集中管理微服务执行的整个生命周期时。
混合方法
在某些情况下,这两种方法的结合可能更有益。协同编排可用于需要高度灵活性和自主性的 Saga 部分,而中心化编排则可用于需要严格控制和协调的部分。
挑战与考量
复杂性:实施 SAGA 比传统事务更为复杂。
缺乏隔离性:中间状态是可见的,可能会导致一致性问题。
错误处理:设计和实现补偿事务可能颇具难度。
测试:对所有可能的场景进行彻底测试至关重要,但可能颇具挑战。
Saga 模式是微服务架构中管理分布式事务的非常强大的工具,在一致性、可扩展性和弹性之间实现了平衡。通过谨慎选择合适的实现方法,可以有效应对分布式事务的挑战,并在各个服务之间保持数据一致性。
你好,我是俞凡,在 Motorola 做过研发,现在在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!
版权声明: 本文为 InfoQ 作者【俞凡】的原创文章。
原文链接:【http://xie.infoq.cn/article/17906690fba621b105f53ed41】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论