ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

《微服务架构设计模式》 第四章读书笔记:使用Saga管理事务

《微服务架构设计模式》 第四章读书笔记:使用Saga管理事务 一、本章前言在单体应用架构中开发者可依托数据库原生ACID事务轻松保障业务数据的一致性、可靠性事务开发简单且无需复杂协调。但微服务架构采用服务拆分、数据私有化、多库独立部署的核心设计传统单体事务、经典分布式事务方案完全失效跨服务业务流程极易出现数据不一致问题。本章作为微服务事务治理的核心章节针对性解决微服务分布式事务痛点系统讲解了Saga模式的诞生背景、核心原理、两种实现模式、隔离性缺陷及工程解决方案是落地微服务最终一致性事务的核心理论依据也是微服务架构设计的必备知识点。二、微服务架构下的事务困境2.1 单体事务与微服务事务的核心差异单体应用的所有业务数据统一存储在单一数据库依托Spring事务注解等原生能力即可实现完整的ACID事务特性保证原子性、一致性、隔离性与持久性。无论下单、支付、退款等复杂串联业务单库事务都能实现要么全部成功、要么全部回滚数据一致性极强。而微服务架构遵循一服务一数据库、数据私有不可见的设计原则核心业务流程往往需要联动订单、用户、后厨、账务等多个独立服务跨多数据库完成数据更新。以书中createOrder()下单流程为例一次下单操作同时读写 4 个服务的数据如图 4-1 所示这种跨服务、跨数据源的业务场景彻底打破了单库 ACID 事务的适用边界传统事务机制完全无法生效亟需全新的分布式事务解决方案。2.2 传统分布式事务XA/2PC被淘汰的核心原因在微服务架构普及前行业依托X/Open XA协议、两阶段提交2PC实现分布式事务但本书明确指出该方案完全不适用于现代微服务架构核心缺陷集中在四点1. 技术栈兼容性极低XA协议仅适配传统关系型数据库无法兼容微服务主流的NoSQL数据库MongoDB、Cassandra、消息中间件RabbitMQ、Kafka使用该协议需要舍弃主流技术栈实用性极差。2. 系统可用性严重受损2PC是同步阻塞事务机制事务所有参与服务必须全部正常可用才能完成事务提交。微服务业务链路越长、参与服务越多系统整体可用性越低与微服务高可用、高容错的核心设计目标相悖。3. 与CAP理论取舍冲突分布式系统遵循CAP理论无法同时满足一致性、可用性、分区容错性。现代微服务优先保障可用性与分区容错性接受数据最终一致性而XA/2PC追求强一致性架构设计理念完全冲突。4. 不符合实际业务场景绝大多数互联网核心业务下单、转账、退款、履约本身无需实时强一致仅需最终一致性即可满足业务需求2PC的强一致设计属于过度设计冗余且低效。2.3 Saga模式核心定义与核心特性为彻底解决微服务跨服务事务一致性问题本书正式引入Saga模式这也是目前微服务实现最终一致性事务的标准、主流解决方案。官方标准定义Saga是一组由异步消息协调的本地事务序列核心设计思路是拆分大而全的跨服务分布式事务拆解为多个独立的单服务本地ACID事务通过异步通信联动最终实现分布式场景下的数据最终一致性。核心特性ACD特性Saga模式舍弃了ACID中的隔离性I仅保留原子性A、一致性C、持久性D。隔离性的缺失是Saga模式所有优缺点、业务适配场景、并发问题及解决方案的核心根源。核心补偿机制与传统事务自动回滚不同Saga 的每一步本地事务执行后都会直接提交、持久化数据无法自动回滚。若后续任意事务步骤执行失败系统必须执行手动编写的补偿事务逆序撤销此前所有已提交的业务操作以此保障数据最终一致补偿执行逻辑如图 4-3 所示2.4 经典案例FTGO下单Saga流程深度解析本书以 FTGO 项目外卖下单业务为典型案例完整演示 Saga 模式的完整执行链路一次完整的下单事务拆解为 6 个串联的本地事务横跨订单、用户、后厨、账务四大核心服务流程清晰且具备极强的业务参考性整体事务拆分结构如图 4-2 所示正常执行流程1. 订单服务创建状态为待审批APPROVAL_PENDING的订单数据2. 用户服务校验用户身份、下单资质及账户状态3. 后厨服务校验订单合规性创建待处理后厨工单4. 账务服务对用户绑定的信用卡进行额度授权锁定5. 后厨服务更新后厨工单状态为待确认准备履约6. 订单服务更新订单状态为已审批APPROVED下单流程完成。异常故障处理逻辑Saga 的核心容错机制为逆序补偿若流程中任意步骤执行失败系统会从失败节点开始反向执行所有前置事务的补偿逻辑。例如信用卡额度授权失败系统会依次撤销后厨工单、取消待审批订单清空本次事务所有数据变更保证数据无残留、无不一致。同时书本明确规范只读校验类步骤无需设计补偿逻辑核心不可逆步骤执行后的后续事务需设计为可成功、可重复执行的事务。完整下单 Saga 每一步对应的补偿事务如下表 4-1 所示三、Saga两种核心协调模式Saga模式的核心落地难点并非事务拆分而是多步骤本地事务的有序调度、异常协调。书中明确划分了Saga的两种唯一落地实现模式二者核心差异为「是否存在中心化调度控制器」适配不同业务场景。3.1 协同式Saga事件驱动型核心原理无中心协调组件所有微服务地位平等、独立自治全程基于事件发布 - 订阅机制联动。每个服务完成自身本地事务后主动发布业务事件下游订阅服务监听事件并触发自身下一步事务执行依靠事件流转驱动完整 Saga 流程。以 FTGO 下单业务为例完整事件驱动流程如图 4-4 所示上文图 4-4 展示了下单 Saga 正常执行的事件流转流程而当流程出现故障时协同式 Saga 依靠事件同样能驱动补偿流程完成数据回滚。以信用卡授权失败场景为例完整补偿事件链路如图 4-5 所示账务服务检测信用卡授权失败后发布Credit card authorization failed失败事件后厨服务订阅该事件执行rejectTicket()补偿逻辑撤销工单工单撤销完成后发布对应事件订单服务订阅事件执行rejectOrder()取消待审批订单完成整条 Saga 事务的逆序补偿。核心优势架构轻量化、无中心化依赖、服务彻底松耦合代码开发简单适配步骤少、链路短的简单业务流程。核心缺陷整体事务流程碎片化分散在各个服务代码中无统一入口管控业务链路难以梳理、问题难以排查、后期维护成本极高多服务互相订阅事件易形成循环依赖违背微服务解耦设计初衷业务迭代升级时需同步修改多个关联服务代码扩展性极差。3.2 编排式Saga中心调度型核心原理引入独立的 Saga 编排器作为中心化控制器统一负责整个分布式事务的定义、调度、监控、异常处理。基于命令 / 回复消息的编排式整体架构如图 4-6 所示。编排器通过命令式消息主动调用各服务执行本地事务接收服务执行结果自动判断下一步执行流程或触发全局补偿事务。核心设计亮点书中提出将编排器建模为状态机完整固化正常执行流程、异常分支流程、故障补偿流程完整下单 Saga 状态机流转模型如图 4-7 所示。所有事务状态支持持久化存储具备可追溯、可复盘、可重试、可测试的特性彻底解决协同式Saga流程混乱的问题。核心优势彻底规避服务循环依赖业务解耦度更高事务流程集中统一管控链路清晰故障定位、问题排查效率高完美适配步骤多、链路长、逻辑复杂的核心业务流程。唯一弊端存在中心化组件若架构设计不合理会导致核心业务逻辑全部堆积在编排器中形成“编排器臃肿、业务服务单薄”的不良架构。原文权威选型结论简单短流程、低复杂度业务可采用协同式Saga企业级复杂核心业务、长链路事务优先使用编排式Saga这也是目前生产环境的主流选型。基于 Eventuate Tram 框架实现创建订单 Saga 时服务内部各核心组件存在固定调用时序从 OrderService 初始化 Saga 状态、发起命令消息到持久化 Saga 实例全流程交互时序如图 4-13 所示。工程落地场景中常使用 Eventuate Tram 框架实现编排式 Saga该框架封装了编排器、消息分发、Saga 状态持久化等底层能力框架内部核心组件结构如图 4-12 所示。四、Saga隔离性缺陷与工程解决方案本书将Saga缺失隔离性引发的并发问题定义为落地Saga模式的最大难点。由于Saga无事务隔离机制多事务并发执行时会出现各类数据异常书本针对性给出了标准化、可落地的解决方案是规避生产事故的核心知识点。4.1 无隔离性引发的三类核心数据异常1.丢失更新一个Saga事务尚未执行完毕、数据未最终敲定另一个并发事务直接覆盖其已提交的临时数据导致前序事务的数据更新丢失引发数据错乱。2.脏读问题事务读取到其他未完成Saga事务的临时中间数据并基于该非最终数据执行业务逻辑最终导致业务出错、数据不一致。3.不可重复读同一个Saga事务的不同执行步骤中多次读取同一业务数据得到不同的数据结果导致事务内部逻辑混乱、执行异常。4.2 六大工业级落地对策书中提供6种纯应用层解决方案无需修改数据库底层机制即可有效规避隔离性缺失带来的并发问题适配绝大多数微服务业务场景1. 语义锁核心常用方案通过自定义业务状态字段待处理、已审批、已取消、已完成等实现应用层锁机制。标记处于事务处理中的数据禁止其他并发事务读取、篡改模拟ACID事务的隔离效果广泛应用于订单、支付等核心业务。2. 交换式更新摒弃直接覆盖数据的更新方式将数据修改改为可颠倒、可回溯的加减流水操作如账户额度增减、库存变动流水彻底避免并发覆盖导致的数据丢失问题。3. 悲观视图优化Saga事务的步骤编排顺序将高风险、易出错的读操作后置执行最大程度减少脏读带来的业务损失降低并发异常概率。4. 重读值乐观锁机制在执行数据更新操作前重新读取数据库最新数据校验数据是否被并发修改。若数据已变更则终止当前事务并触发补偿杜绝丢失更新问题。5. 版本文件记录所有业务操作流水与请求日志对异步通信中乱序到达的请求进行重新排序、规整执行解决微服务异步消息乱序引发的事务异常。6. 业务风险评级基于业务风险等级动态适配事务方案普通低风险业务采用Saga最终一致性方案大额资金、核心交易等高风险业务可兼容传统强一致事务平衡系统可用性与数据安全性。4.3 Saga事务三级分类模型为标准化补偿事务设计、规范事务流程书本将所有Saga事务步骤划分为三类分类标准示意如图 4-8 所示是Saga落地的基础设计准则1.可补偿事务事务流程前期的可撤销操作业务上支持回滚必须配套开发对应的补偿事务保障异常时可反向撤销。2.关键性事务整个Saga流程的核心分水岭该事务执行成功后业务流程不可逆、无法回滚无对应补偿逻辑是事务状态切换的关键节点。3.可重复性事务关键性事务之后的后续步骤业务设计上保证必然执行成功、支持幂等重试无需设计补偿事务。五、Saga工程落地架构本章结合Eventuate Tram框架给出了标准化、可落地的Saga微服务架构明确四大核心组件的职责分工为代码落地提供了清晰规范1.领域服务承载核心业务逻辑负责创建业务数据、初始化Saga事务流程是业务执行的载体。2.Saga编排器通过DSL语法定义状态机固化所有正常流程、异常分支、补偿流程统一调度全链路事务执行。3.Saga状态类持久化存储Saga事务的运行状态、业务参数、执行轨迹保障事务可续跑、可追溯、可重试。4.命令处理器作为服务与编排器的通信入口接收中心化调度指令执行本地事务并返回执行结果。同时书本着重强调核心工程规范必须使用事务性消息保证数据库数据更新与消息发送的原子性彻底杜绝消息丢失、数据与事务状态不一致的问题。六、本章总结1. 微服务多库拆分的架构特性导致传统ACID事务、XA/2PC分布式事务完全失效2PC因低可用、兼容性差、过度设计的缺陷已不适用于现代微服务架构。2. Saga模式是微服务实现分布式数据最终一致性的最优方案核心思想为事务拆分本地ACID执行异步消息协调异常补偿回滚适配绝大多数微服务业务场景。3. Saga分为协同式与编排式两种实现协同式轻量化但维护性差编排式集中可控、稳定性强是企业级生产环境的主流选型。4. Saga的核心短板是缺失事务隔离性会引发丢失更新、脏读、不可重复读三类并发问题需通过语义锁、乐观锁等六种应用层方案规避。5. 工程落地需严格遵循事务三级分类规范合理设计补偿事务、依托状态机管控流程、使用事务性消息保障分布式事务稳定可靠。七、拓展思考书中原生依托的Eventuate Tram框架较为老旧当下主流开发已大幅简化Saga落地成本。Spring Cloud生态可直接使用Seata Saga快速实现事务编排云原生跨语言场景可选用Temporal框架主流框架均已内置状态机管理、事务消息、隔离控制能力开发者无需手动实现复杂的补偿与并发控制逻辑可直接复用书本Saga核心设计思想高效落地生产级分布式事务。
返回列表