Saga Pattern
Saga 补偿流程
Saga 会把几个已经保存的步骤连成一项业务任务。后面的步骤失败时,它会重试,或加入另一个步骤来修复前面已经完成的操作。
saga ID + local transaction -> next step; failure -> retry | compensation -> terminal state- ✓机票已保留flight_tx_7
- ✓银行卡已扣款pay_tx_8
- !酒店没有空房hotel_tx_9
saga ID + local transaction -> next step; failure -> retry | compensation -> terminal stateJOB另一个例子
订单 `984` 先预留库存、授权 NT$248,再请求发货。发货服务拒绝该地址。Saga 会用相同 Saga ID 取消授权并释放库存,最后把订单记为已补偿。
主要部分
- 01Saga ID 与状态
- 02参与的服务
- 03本地事务步骤
- 04步骤结果消息
- 05重试或补偿
- 06审计与人工恢复
什么时候用
一项业务任务跨越多个服务或数据库时,可以使用 Saga。只有在单个全成或全败的数据库步骤无法涵盖整个任务时,才需要它。要定义每个已保存步骤、下一个操作、重试、补救操作和最终状态。
什么时候不要用
一次数据库保存就能完成整个任务时,不要加入 Saga。补救操作也是新的任务。它可能失败,也可能留下不同结果。某个操作无法安全撤销时,要交给人员判断。
代码里的名称
saga ID + local transaction -> next step; failure -> retry | compensation -> terminal state 上线前要检查
检查接口约定、任何情况下都不能破坏的规则、授权与输入限制。测试重试、重复执行只生效一次、超时与部分失败。验证数据完整性、兼容性、监控、恢复与回到上一版。
预期结果:为这套系统设计或检查 Saga 补偿流程 (Saga Pattern),并让数据保持正确、安全且容易维护。 用户场景:订单 `984` 先预留库存、授权 NT$248,再请求发货。发货服务拒绝该地址。Saga 会用相同 Saga ID 取消授权并释放库存,最后把订单记为已补偿。 技术概念或控制措施:Saga 补偿流程 (Saga Pattern)。 适用理由:一项业务任务跨越多个服务或数据库时,可以使用 Saga。只有在单个全成或全败的数据库步骤无法涵盖整个任务时,才需要它。要定义每个已保存步骤、下一个操作、重试、补救操作和最终状态。 不应使用的情况:一次数据库保存就能完成整个任务时,不要加入 Saga。补救操作也是新的任务。它可能失败,也可能留下不同结果。某个操作无法安全撤销时,要交给人员判断。 工程要求:定义输入、输出、接口约定,以及任何情况下都不能破坏的规则。说明授权与输入检查范围。定义失败、超时、重试和重复执行只生效一次的规则。也要定义数据迁移与兼容限制。 运营要求:加入监控信号与隐藏敏感数据的日志。设置容量上限并写好操作手册。测试恢复与回到上一版的流程。 验收标准:接口约定与失败路径测试通过。重试或部分失败时,数据与授权规则仍正确。性能上限、监控、恢复与回到上一版的方法都已验证。 证据与限制(证据边界):没有一份官方标准能涵盖全部内容。不同团队、平台或框架的用法可能不同。 待确认:程序运行环境、数据位置、流量形态、数据一致需求和安全边界。也要确认兼容周期、服务目标(SLO)与恢复上一版的限制。
检查这份需求
请 AI 编程助手检查当前如何使用 Saga 补偿流程 (Saga Pattern)。 定义:Saga 会把几个已经保存的步骤连成一项业务任务。后面的步骤失败时,它会重试,或加入另一个步骤来修复前面已经完成的操作。 生产环境检查:检查接口约定、任何情况下都不能破坏的规则、授权与输入限制。测试重试、重复执行只生效一次、超时与部分失败。验证数据完整性、兼容性、监控、恢复与回到上一版。 修改程序前,先列出看到的证据、缺口、严重程度,以及最小且安全的修正。