MQ 事务方案(可靠消息事务)
Last updated
Last updated
基于 MQ 的分布式事务方案其实是对本地消息表的封装,将本地消息表“存入” MQ 内部,其他方面的协议基本与本地消息表一致。
通过基于本地消息表的可靠消息最终一致性方案可以看出,其本质上是通过引入本地消息表来保证本地事务与发送消息的原子性。那如果 MQ 本身就能够直接保证消息发送与本地事务的原子性岂不是更方便了,为此在 RocketMQ 中提供了所谓的事务消息。
这种情况下,事务主动方服务正常,没有发生故障,发送消息的流程如下:
发送方向 MQ 服务端(MQ Server)发送 half 消息。
MQ Server 将消息持久化成功之后,向发送方 ack 确认消息已经发送成功。
发送方开始执行本地事务逻辑。
发送方根据本地事务执行结果向 MQ Server 提交二次确认(commit 或是 rollback)。
MQ Server 收到 commit 状态则将 half 消息标记为可投递,订阅方最终将收到该消息;MQ Server 收到 rollback 状态则删除 half 消息,订阅方将不会接受该消息。
在断网或者应用重启等异常情况下,图中 4 提交的二次确认超时未到达 MQ Server,此时处理逻辑如下:
MQ Server 对该消息发起消息回查。
发送方收到消息回查后,需要检查对应消息的本地事务执行的最终结果。
发送方根据检查得到的本地事务的最终状态再次提交二次确认。
MQ Server 基于 commit/rollback 对消息进行投递或者删除。
相比本地消息表方案,MQ 事务方案优点是:
消息数据独立存储 ,降低业务系统与消息系统之间的耦合。
吞吐量大于使用本地消息表方案。
缺点:
一次消息发送需要两次网络请求(half 消息 + commit/rollback 消息) 。
业务处理服务需要实现消息状态回查接口。