分布式事务型消息队列原理如下:
- 发送方(必须有分组,将同类的发送方定义为一组)将半事务消息发送至消息队列分布式事务型消息队列服务端。
- 服务端将消息持久化成功之后,向发送方返回 Ack 确认消息已经发送成功,此时消息为半事务消息,消费者订阅不到此类消息。
- 生产者开始执行本地事务逻辑,本地事务逻辑可以是一个或者多个。
- 生产者根据本地事务执行结果向服务端提交事务确认(Commit 或是 Rollback),服务端收到 Commit 类型的事务确认则将半事务消息标记为可投递,消费者最终将收到该消息;但是服务端收到 Rollback 类型的事务确认则删除半事务消息,订阅方将不会接受该消息。
上述描述的是分布式事务型消息队列的正向流程,实际上生产者可能出现问题,网络也不能保证100%可用,将导致图示中的第六步无法被执行,等到经过一段时间后,分布式事务型消息队列会触发事务超时反查,优先向原有的生产者发起超时查询,在原有生产者无法被查询前提下,将向原有生产者同组的其他生产者发起状态查询,最终必须确保该半事务消息最终有确认状态。