单体应用拆分为微服务后,原本地事务变成跨服务调用,部分失败导致数据不一致。请设计一种基于最终一致性的补偿方案并说明幂等和顺序问题。
旗舰版来源:alibaba中级工程师Outbox模式消息顺序性消息幂等设计最终一致性
草稿
答案解析
可以把原来的本地事务拆成“本地事务 + 可靠事件 + 补偿机制”的最终一致性方案。
比如一个下单场景,原来单体里可能是:创建订单、扣库存、扣余额、生成物流单都在一个数据库事务里。拆成微服务后,我不会用强依赖的分布式事务去硬包住所有服务,而是把主流程设计成可恢复、可补偿的状态机。
核心思路是:
1. 每个服务只保证自己的本地事务一致性 比如下单服务创建订单时,在同一个本地事务里写入订单表和事件表: 订单状态:CREATED 或 PENDING 事件表:ORDER CREATED 这两个操作必须在一个本地事务中完成,保证订单创建成功就一定有事件可以被后续投递。
2. 通过可靠消息驱动后续服务执行 后台任务或 CDC 组件扫描事件表,把 ORDER CREATED 投递到 MQ。库存服务消费消息后执行扣库存,成功后发送 STOCK DEDUCTED;支付服务或账户服务继续处理,成功后发送下一步事件。 整体流程类似 Saga 编排或事件编排: ```te
登录后查看完整内容
