电商下单链路中的消息队列设计
电商下单链路里的消息队列要服务异步解耦、库存协同、支付回调、超时关闭、通知和报表,同时保证幂等与补偿。
电商下单链路中的消息队列设计
电商下单不是一个接口写一张订单表那么简单。订单创建后,还会影响库存、优惠券、支付、通知、履约、推荐、报表等多个系统。
如果全部同步调用,下单接口会慢,也会因为下游服务故障拖垮核心链路。
Rendering diagram...
下单事件设计
订单创建成功后可以发布 OrderCreated。
{
"event_id": "evt_order_10001_created",
"event_type": "OrderCreated",
"order_id": "10001",
"user_id": "90001",
"amount": 199.00,
"created_at": "2026-05-17T21:30:00+08:00"
}
消费者各自订阅这个事件,完成自己的工作。
支付事件
支付成功后发布 OrderPaid。库存、履约、积分、报表都可以基于支付成功事件继续推进。
支付事件必须幂等。支付回调可能重复,MQ 消费也可能重复。
UPDATE orders
SET status = 'PAID'
WHERE id = 10001
AND status = 'CREATED';
条件更新能防止重复支付事件造成状态回退或重复处理。
超时取消
下单后发送一条延迟消息,30 分钟后检查订单是否仍未支付。
如果仍未支付,就取消订单并释放库存。如果已经支付,就忽略消息。
消费者拆分
一个 Topic 不一定只有一个消费者。不同业务可以使用不同 Consumer Group。
order-events
├── inventory-service
├── report-service
├── notification-service
└── recommendation-service
这样一个事件可以同时驱动多个系统,而且它们互不影响。
常见坑
第一个坑是同步链路过长。下单接口里同步调用太多系统,稳定性会很差。
第二个坑是消息没有唯一 ID。没有事件 ID,就很难做去重。
第三个坑是没有状态机。订单状态随便改,重复消息和乱序消息会让数据错乱。
第四个坑是没有补偿。消息队列不是百分百魔法,关键链路仍然需要对账和补偿任务。
小结
电商下单链路用 MQ 的核心,是把订单状态变化转成事件流。核心交易由订单服务保证,非核心动作通过消息异步扩展。