1. 分布式事务的困境与Saga的诞生
在微服务架构中,一个业务操作经常需要跨多个服务完成数据更新。传统单体应用中的ACID事务在分布式环境下变得难以实现——服务间的网络调用可能失败、系统可能崩溃、节点可能宕机。这就像一群人试图同时按下不同楼层的电梯按钮,任何一个人的延迟或失误都会导致整体计划失败。
2007年,Hector Garcia-Molina和Kenneth Salem在论文《Sagas》中首次提出了这种长事务解决方案。其核心思想是将一个大事务拆分为多个本地事务,通过补偿机制保证最终一致性。这与我们日常生活中"分步执行+留后路"的思维方式高度一致。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Saga模式的核心设计原理
2.1 事务链与补偿机制
每个Saga由一系列子事务(Ti)和对应的补偿动作(Ci)组成,形如:
code复制T1 -> T2 -> ... -> Tn
C1 <- C2 <- ... <- Cn
当所有子事务成功时,Saga完成;若某步骤失败,则逆向执行已成功的补偿操作。这就像组装家具时,我们会按说明书逐步安装,并在每一步保留拆卸的可能性。
2.2 两种协调模式
编排式(Choreography):
- 无中心协调器
- 服务间通过事件总线通信
- 适合简单流程
- 典型实现:Kafka事件日志
编导式(Orchestration):
- 由专门的Saga协调器控制流程
- 集中管理状态和补偿逻辑
- 适合复杂业务流程
- 典型实现:Camunda工作流引擎
3. 实战中的Saga实现细节
3.1 事务日志设计
必须持久化记录每个Saga实例的状态变迁。建议采用如下表结构:
sql复制CREATE TABLE saga_log (
saga_id VARCHAR(36) PRIMARY KEY,
current_step INTEGER NOT NULL,
status ENUM('PENDING','SUCCEEDED','FAILED','COMPENSATING') NOT NULL,
payload JSON NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMEST
