数据同步“最终一致性”方案:本地消息表在跨系统订单同步中的应用
技术领域:分布式系统|最终一致性
微服务架构下,跨服务数据同步是分布式系统的经典难题。Taocarts系统的订单创建需要同步到ERP、物流系统、采购系统等多个下游服务。如果数据同步不一致,就会导致发货延迟、库存错乱等严重问题。
本地消息表是经典的最终一致性方案。设计如下:订单创建时,在同一数据库事务中写入订单记录和待发送消息记录。事务提交后,后台定时任务扫描消息表,将pending状态的消息发送到消息队列。下游服务消费消息后执行各自的业务逻辑。如果发送失败,消息会留在表中,定时任务会自动重试(指数退避:1分钟、2分钟、4分钟)。重试超过3次仍失败的消息进入死信队列,人工介入处理。
消费端需要保证幂等——同一条消息可能因网络重试被重复投递。通过维护已处理消息ID表来去重:每条消息处理前先检查是否已处理过,未处理才执行业务逻辑,处理完记录消息ID。这样,即使消息重复投递,也不会导致重复扣款、重复发货。
数据同步设计的核心是“最终一致性”,而非“实时一致性”。允许短暂的不一致窗口,但要保证最终收敛。宁愿用户晚几分钟看到订单状态更新,也不能出现订单丢失。