RocketMQ 事务
1、A 服务先发送个 Half Message 给 Broker 端,消息中携带 B 服务 即将要 + 100 元的信息。
2、当 A 服务知道 Half Message 发送成功后,那么开始第 3 步执行本地事务。
3、执行本地事务 (会有三种情况 1、执行成功。2、执行失败。3、网络等原因导致没有响应)
4.1)、如果本地事务成功,那么 Product 像 Broker 服务器发送 Commit, 这样 B 服务就可以消费该 message。
4.2)、如果本地事务失败,那么 Product 像 Broker 服务器发送 Rollback, 那么就会直接删除上面这条半消息。
4.3)、如果因为网络等原因迟迟没有返回失败还是成功,那么会执行 RocketMQ 的回调接口, 来进行事务的回查。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dt6Tu6IR-1622039535998)(/assets/2021-05-25-11-37-25.png)]
只有A服务本地事务执行成功 ,B服务才能消费该message。
Half Message(半消息)
是指暂不能被Consumer消费的消息。
Producer 已经把消息成功发送到了 Broker 端,但此消息被标记为暂不能投递状态,处于该种状态下的消息称为半消息。
需要 Producer 对消息的二次确认后,Consumer才能去消费它
。
消息回查
由于网络闪段,生产者应用重启等原因。导致 Producer 端一直没有对 Half Message(半消息) 进行 二次确认。
这时Broker服务器会定时扫描长期处于半消息的消息,会主动询问 Producer端 该消息的最终状态(Commit或者Rollback),该消息即为 消息回查。
为什么要先发送Half Message(半消息)
1)可以先确认 Broker服务器是否正常 ,如果半消息都发送失败了 那说明Broker挂了。
2)可以通过半消息来回查事务,如果半消息发送成功后一直没有被二次确认,那么就会回查事务状态。
什么情况会回查
-
执行本地事务的时候,由于突然网络等原因一直没有返回执行事务的结果(commit或者rollback)导致最终返回UNKNOW,那么就会回查。
-
本地事务执行成功后,返回Commit进行消息二次确认的时候的服务挂了,在重启服务那么这个时候在Broker端它还是个Half Message(半消息),这也会回查。