RocketMQ如何实现分布式事务
RocketMQ如何实现分布式事务
- A服务也就是发送方发送half message 到 broker服务端
- 当A服务指导半消息发送成功后,开始执行本地事务
- 执行本地事务会有三种情况(1,执行成功 2,执行失败 3,网络等原因没有响应)
- 如果执行成功,返回commit
- 如果执行失败,返回rollback
- 如果没有收到响应,那么回查事务状态
- 根据事务的状态执行操作
- 如果commit,那么提交到订阅方
- 如果rollback,那么不投递消息,三天后删除
- 如果没有收到确认,那么回查事务状态
Q : 为什么要先发送半消息 ?
A :
- 可以先确认broker服务器是否正常,如果半消息都发送失败了那么说明broker挂了。
- 可以通过半消息来回查事务,如果半消息发送成功后一直没有被二次确认,那么就会回查事务状态
Q : 什么情况会回查 ?
A :
- 执行本地事务的时候,由于网络等原因一直没有返回事务执行的结果(commit 或者 rollback)导致最终返回UNKNOW,那么就会回查。
- 本地事务执行成功后,发送commit消息的服务挂了,重启服务的时候,这个broker还是半消息,那么也会回查。(特别注意,如果回查,一定要先查看当前事务执行状态,再看是否需要重新执行本地事务。不然有可能执行两次本地事务)