事务消息是否了解?场景题:比如下单清空购物车,你是如何设计 Published on Apr 16, 2026 in 随笔 with 0 comment 事务消息主要用来解决消息生产者和消息消费者的数据一致性问题。我们先来回忆一下:一条普通的消息队列消息,从产生到被消费,经历的流程: 1. 生产者产生消息,发送带 MQ 服务器 2. MQ 收到消息后,将消息持久化到存储系统。 3. MQ 服务器返回 ACk 到生产者。 4. MQ 服务器的消息 push 给消费者 5. 消费者消费完消息,响应 ACK 6. MQ 服务器收到 ACK,认为消息消费成功,即在存储中删除消息 消息队列的事务消息流程 是怎样 的呢? 1. 生产者产生消息,发送一条半事务消息到 MQ 服务器 2. MQ 收到消息后,将消息持久化到存储系统,这条消息的状态是待发送状态。 3. MQ 服务器返回 ACK 确认到生产者,此时 MQ 不会触发消息推送事件 4. 生产者执行本地事务 5. 如果本地事务执行成功,即 commit 执行结果到 MQ 服务器;如果执行失败,发送 rollback。 6. 如果是正常的 commit,MQ 服务器更新消息状态为可发送;如果是 rollback,即删除消息。 7. 如果消息状态更新为可发送,则 MQ 服务器会 push 消息给消费者。消费者消费完就回ACK。 8. 如果 MQ 服务器长时间没有收到生产者✁ commit 或者rollback,它会反查生产者,然后根据查询到的结果执行最终状态 我们举个下订单清空购物车的例子吧。订单系统创建完订单后,然后发消息给下游系统购物车系统,清空购物车。 1. 生产者(订单系统)产生消息,发送一条半事务消息到 MQ 服务器 2. MQ 收到消息后,将消息持久化到存储系统,这条消息的状态是待发送状态。 3. MQ 服务器返回 ACK 确认到生产者,此时 MQ 不会触发消息推送事件 4. 生产者执行本地事务(订单创✁成功,提交事务消息) 5. 如果本地事务执行成功,即 commit 执行结果到 MQ 服务器;如果执行失败,发送 rollback。 6. 如果是 commit 正常提交,MQ 服务器更新消息状态为可发送;如果是 rollback,即删除消息。 7. 如果消息状态更新为可发送,则 MQ 服务器会 push 消息给消费者(购物车系统)。消费者消费完(即拿到订单消息,清空购物车成功)就应答 ACK。 8. 如果 MQ 服务器长时间没有收到生产者✁ commit 或者rollback,它会反查生产者,然后根据查询到的结果(回滚操作或者重新发送消息)执行最终状态 有些伙伴可能有疑惑,如果消费者消费失败怎么办呢?那数据是不是不一致啦?所以就需要消费者消费成功,执行业务逻辑成功,再反馈 ack 嘛。如果消费者消费失败,那就自动重试嘛,接口支持幂等即可 本文由 admin 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。