rocketmq——对事务的支持

本文介绍了RocketMQ基于两阶段提交实现事务的流程。发送方首先发送'待确认'消息,待RocketMQ持久化后确认消息发送成功。接着执行本地逻辑,根据结果发送commit或rollback。异常情况下,RocketMQ会发起回查请求,根据回复决定消息状态。4.x版本后,由于性能考虑,移除了内置事务功能,但用户仍可根据需求自定义实现。涉及关键类包括LocalTransactionExecuter、TransactionMQProducer和TransactionCheckListener。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现方式

通过两阶段提交的方式实现事务

具体的流程

  1. 发送方向rocketmq发送“待确认”消息
  2. rocketmq将收到的“待确认”消息持久化成功后,向发送方回复消息已经发送成功了,此时第一阶段消息发送完成
  3. 发送方开始执行本地逻辑
  4. 发送方根据本地事件的执行结果向rocketmq发送第二次确认消息(commit或rollback)。若为commit,则将第一阶段消息标记为可投递,订阅方可收到消息;若为rollback,则删除第一阶段消息,订阅方收不到消息
  5. 若出现异常情况,步骤4提交的二次确最终为到达rocketmq,服务器会在固定时间段后对“待确认”消息发起回查请求
  6. 发送方收到消息回查请求后(如果发送一阶段消息的producer不能工作,回查请求将被发送到和producer在同一个group里的其他producer),通过检查对应消息的本地事件执行结果返回commit或rollback状态
  7. rocketmq收到回查请求后,按步骤4的逻辑处理

4.x版本后去除了该部分功能

由于rocketmq依赖将数据顺序写到磁盘这个特征来提高性能,上面步骤4却需要更改第一阶段消息的状态,这样会造成磁盘catch的脏页过多,降低系统性能。系统中上层class还存在,用户还可以更具实际需求去实现事务功能。
支持实现事务的三个class:

  1. LocalTransactionExecuter:用来实例化步骤3,根据情况返回LocalTransactionState.ROLLBACK_MESSAGE或LocalTransactionState.COMMIT_MESSAGEZ状态
  2. TransactionMQProducer,用法和DefaultMQProducer类型,要通过启动一个producer并发消息,需多设置本地事务处理函数和回查状态
  3. TransactionCheckListener,实现步骤5中的MQ服务器回查请求,返回LocalTransactionState.ROLLBACK_MESSAGE或LocalTransactionState.COMMIT_MESSAGE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Walter Sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值