中间件速查手册
消息队列Transactional Message

事务消息 是什么?

保证「本地事务成功」和「消息发出」要么都成立要么都不成立

类比:寄快递和记账绑定,账没记上就不寄

要解决什么问题

下单要写订单库、又要发消息通知库存。先写库再发消息,发消息失败就丢事件;先发消息再写库,库回滚了消息已经发出去了。这是典型的分布式一致性问题。

半消息 + 回查

RocketMQ 的做法是把消息分成两步提交,中间留一个可回查的窗口。

  • 1. 发半消息:消息到了 Broker,但消费者看不见
  • 2. 执行本地事务:写订单库
  • 3. 提交或回滚:成功则消息可见,失败则删除
  • 4. 回查:Broker 没收到确认时,定时问生产者「这笔事务到底成没成」,最多 15 次

注意

事务消息保证的是「生产者本地事务与消息发送」的原子性,不保证消费者一定处理成功。消费端仍需幂等 + 重试。另外回查接口必须实现,否则消息可能长期处于半消息状态。

它出现在这些中间件里

相关问题

相关概念