分布式系统服务间通信中断处理:电商与仓库场景常用算法有哪些?
应对分布式场景下两军问题类挑战的常用方法
以下是实际业务中解决这类分布式一致性问题的常用方案:
幂等性设计
给每笔库存扣减请求分配唯一的请求ID,仓库服务收到请求时先校验该ID的处理记录:如果已经处理过,直接返回成功响应;未处理则执行扣减。这样商店在重试请求时,既不会重复扣减库存,还能获取到之前的处理结果。消息队列+最终一致性
商店完成客户支付后,把库存扣减指令存入本地持久化的消息队列,先给客户返回“支付成功,等待发货”的反馈。仓库服务持续监听队列,处理完库存扣减后,再发送发货确认消息给商店。商店收到消息后更新订单状态,若中间出现失败,队列会自动重试,直到双方状态最终对齐。状态查询补偿机制
商店设置定时任务,针对未确认状态的订单,主动向仓库发起库存扣减状态查询。仓库根据订单号或请求ID返回结果:如果库存已扣减,商店就更新订单为发货状态并通知客户;如果未处理,就重新发起扣减请求。TCC分布式事务协议
采用Try-Confirm-Cancel三段式流程:- Try阶段:仓库锁定对应数量的库存,确保后续可执行扣减;
- Confirm阶段:商店收到Try成功的响应后,触发Confirm操作,仓库正式扣减库存;若未收到响应,商店可重试Confirm或触发Cancel;
- Cancel阶段:若订单取消或超时,仓库释放锁定的库存。
通过这种补偿机制保证事务最终一致。
本地事件表+重试机制
商店发起库存扣减前,先把“待扣减库存”的订单事件写入本地数据库的事件表。之后发起请求,若请求失败,定时任务会扫描事件表中的未完成事件,不断重试请求,直到收到仓库的响应,再更新事件状态为完成。
内容的提问来源于stack exchange,提问作者Andrei
相关产品推荐
相关产品推荐

