半消息:是指暂时还不能被 Consumer 消费的消息,Producer 成功发送到 Broker 端的消息,但是此消息被标记为 “暂不可投递” 状态,只有等 Producer 端执行完本地事务后经过二次确认了之后,Consumer 才能消费此条消息。

依赖半消息,可以实现分布式消息事务,其中的关键在于二次确认以及消息回查:

怎么实现分布式消息事务的_消息发送

1、Producer 向 broker 发送半消息

2、Producer 端收到响应,消息发送成功,此时消息是半消息,标记为 “不可投递” 状态,Consumer 消费不了。

3、Producer 端执行本地事务。

4、正常情况本地事务执行完成,Producer 向 Broker 发送 Commit/Rollback,如果是 Commit,Broker 端将半消息标记为正常消息,Consumer 可以消费,如果是Rollback,Broker 丢弃此消息。

5、异常情况,Broker 端迟迟等不到二次确认。在一定时间后,会查询所有的半消息,然后到 Producer 端查询半消息的执行情况。

6、Producer 端查询本地事务的状态

7、根据事务的状态提交 commit/rollback 到 broker 端。(5,6,7 是消息回查)

8、消费者段消费到消息之后,执行本地事务,执行本地事务。