消息队列Transactional Message
事务消息 是什么?
保证「本地事务成功」和「消息发出」要么都成立要么都不成立
类比:寄快递和记账绑定,账没记上就不寄
要解决什么问题
下单要写订单库、又要发消息通知库存。先写库再发消息,发消息失败就丢事件;先发消息再写库,库回滚了消息已经发出去了。这是典型的分布式一致性问题。
半消息 + 回查
RocketMQ 的做法是把消息分成两步提交,中间留一个可回查的窗口。
- 1. 发半消息:消息到了 Broker,但消费者看不见
- 2. 执行本地事务:写订单库
- 3. 提交或回滚:成功则消息可见,失败则删除
- 4. 回查:Broker 没收到确认时,定时问生产者「这笔事务到底成没成」,最多 15 次
注意
事务消息保证的是「生产者本地事务与消息发送」的原子性,不保证消费者一定处理成功。消费端仍需幂等 + 重试。另外回查接口必须实现,否则消息可能长期处于半消息状态。