概念介绍
Half(Prepare) Message: 指暂时不能传递的消息。当消息成功发送到MQ服务器,但服务器没有收到来自生产者的消息的第二个确认,则该消息被标记为“临时不可交付”。此状态中的消息称为半提交消息(Prepare消息)。
Message Status Check: 在网络断开或生产者应用程序重新启动,可能导致丢失第二个确认事务的消息。当MQ服务器发现一条消息长时间保持为半提交消息转态时,它将向消息生产者发送一个请求,检查消息的最终状态(提交或回滚)。
事务性消息执行流程
RocketMQ的事物执行流程如下图所示:

- 生产者发送Prepare消息到MQ服务器。
- 成功发送Prepare消息后,执行本地事务。
- 根据本地事务结果向MQ服务器发送提交或回滚消息。
- 如果在本地事务执行中生产者将提交/回滚消息丢失,或悬而未决。MQ服务器将检查消息发送到同一组中的每个生产者,以此来获得消息本地事务执行的状态。
- 根据本地事务状态生成应答提交/回滚消息。
- 提交的消息将会提供给消费者消费,但是回滚的消息将被MQ服务器丢弃。
设计细节
RocketMQ的事务性消息设计架构总览如下图:

发送事务性消息

检查事务性消息
