事务消息的设计思想、使用方式、原理过程

设计思想

(1) 两阶段提交
分为parpare准备消息和commit提交消息;
准备消息不会被消费;

第一阶段:生产者向Broker发送准备消息,发送成功, 开始执行本地事务;消息通过transactionID进行标记唯一;准备消息存在HALF_TOPIC中
第二阶段:生产者执行完成本地事务,根据结果,返回状态码,状态码包括Commit/RollBack/UnKnown;

Broker收到Commit状态码,则将准备消息变为确认消息,确认消息可以被消费;
Broker收到RollBack状态码,则丢弃准备消息,因为事务执行失败;
Broker收到UnKnown,Broker进行消息回查,根据回查结果判定为超时/失败/补传成功;UnKnown状态回触发回查,回查默认最大次数15次,第一次间隔6s,后续回查间隔60s;

(2) 事务状态回查

问:为什么需要状态回查?
答:因为事务的执行可能会比较久,需要判定为超时;或者生产者发送状态码,出现丢失;

Broker会定期扫描HALF_TOPIC中的准备消息,根据准备消息的transactionID,检查对应的本地事务的执行状态,保证消息状态和本地事务的状态保持一致;

事务消息配置

在broker.conf中配置
transactionCheckMax:消息回查最大次数,默认15次;
transactionCheckInterval:检测频率,默认60s;
transactionTimeOut:过期时间

事务消息使用过程

(1) 创建TransactionMqProducer
(2) 创建TransactionListener,实现这个接口,实现两个方法,executeLocalTransaction事务执行方法和checkLocalTransaction事务回查方法
(3) 创建任务线程池,给producer设置线程池、设置listener;
(4) 启动生产者,发送一条准备消息,发送成功,则触发执行executeLocalTransaction方法;

详细实现过程

(1) 生产者同步发送准备消息
(2) 准备消息写入Borker的half topic中,不会被消费
(3) 启动一个本地事务处理
(4) 本地事务执行成功提交Commit,失败则提交Rollback,超时提交或提交Unknow状态则会触发broker的事务回查
(5) commit状态码,Broker则将该条准备消息放到原本的TOPIC中,可以被消费
(6) RollBack状态码,Broker丢弃该条消息
(7) UnKnown状态码,超时、触发回查
(8) 执行回查方法,根据回查结果,业务处理

事务消息其实只是保证了生产者发送消息成功与本地执行事务的成功的一致性

事务消息的成功投递是需要经历三个Topic的,分别是:
Half Topic:用于记录所有的prepare消息
Op Half Topic:记录已经提交了状态的prepare消息
Real Topic:事务消息真正的Topic,在Commit后会才会将消息写入该Topic,从而进行消息的投递

源码流程简述

事务执行

(1) 入口为sendMessageInTransaction
(2) TRAN_MSG如果为true,则以同步的方式发送消息
(3) 发送成功,则调用TransactionListener 的executeLocalTransactions方法

回查

(1) 使用TransactionCheckMessageService线程的check方法定期检查Half Topic中的消息,加载broker中配置的消息实际、回查次数、回查间隔时间等参数,检查本地事务执行状态,调用checkLocalTransaction方法;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值