为什么要设计一个数据一致性组件
首先说一下智能仓储系统的场景:智能仓储系统的核心链路涉及多个系统,但是对于数据最终一致性有要求,且部分场景需要补偿机制。
我们需要与诸多二方系统和三方系统对接,比如:
-
车辆调度系统,可能就会遇到:
- 车不来:下发调度信息的时候,消息发送失败,导致车辆不来
- 来错车:下发调度信息的时候,消息乱序,导致来错车
- 车不走:下发车辆离站消息的时候,消息发送失败,导致车辆不走
-
与算法服务对接
- 离线任务下发失败
- 调用算法计算热度
-
与外设系统交互,可能会遇到:
-
灯不亮:
- 发送亮灯消息的时候,消息发送失败,导致外设系统未接收到消息,灯不亮
- 外设系统与物理设备交互,调用相关接口失败
-
灯不灭:
- 发送灭灯消息的时候,消息发送失败,导致外设系统未接收到消息,灯不灭
- 外设系统与物理设备交互,调用相关接口失败,灯不灭
-
亮错灯:
- 发送亮灯消息的时候,消息乱序,导致外设系统亮灯错乱
-
-
与打印系统交互,可能会遇到:
- 没打印:接口调用失败,导致单据打印失败
-
与上游系统交互:
- 各种单据的实操结果未正常反馈上游
- 出库单按单反馈
- 出库单按箱反馈
- 入库单按单反馈
- 入库单按箱反馈
- 盘点单按单反馈
- 库存调整单按单反馈
- ……
- 各种单据的实操结果未正常反馈上游
-
与基础数据系统交互
- 货架热度计算结果更新失败
- 料箱热度计算结果更新失败
- 容器位置更新
这些场景无法使用本地事务实现,因为是分布式系统。有些场景也不能纯用 MQ 的消息事务实现,因为 RocketMQ 事务消息重试机制不灵活。