RocketMQ 如何实现分布式事务?
1、生产者向 MQ 服务器发送 half 消息。
2、half 消息发送成功后,MQ 服务器返回确认消息给生产者。
3、生产者开始执行本地事务。
4、根据本地事务执行的结果(UNKNOW、commit、rollback)向 MQ Server 发送提交
或回滚消息。
5、如果错过了(可能因为网络异常、生产者突然宕机等导致的异常情况)提交/回滚消息,
则 MQ 服务器将向同一组中的每个生产者发送回查消息以获取事务状态。
6、回查生产者本地事物状态。
7、生产者根据本地事务状态发送提交/回滚消息。
8、MQ 服务器将丢弃回滚的消息,但已提交(进行过二次确认的 half 消息)的消息将投递
给消费者进行消费。
Half Message : 预 处 理 消 息 , 当 broker 收 到 此 类 消 息 后 , 会 存 储 到
RMQ_SYS_TRANS_HALF_TOPIC 的消息消费队列中。
检查事务状态:Broker 会开启一个定时任务,消费 RMQ_SYS_TRANS_HALF_TOPIC 队列
中的消息,每次执行任务会向消息发送者确认事务执行状态(提交、回滚、未知),如果是
未知,Broker 会定时去回调在重新检查。
超时:如果超过回查次数,默认回滚消息。
也就是他并未真正进入 Topic 的 queue,而是用了临时 queue 来放所谓的 half message,
等提交事务后才会真正的将 half message 转移到 topic 下的 queue。