写点什么

消息队列: 事务实现

用户头像
正向成长
关注
发布于: 58 分钟前
消息队列:事务实现

本文主要是针对消息队列中事务的实现方式的介绍。


消息队列分布式事务实现方式

RocketMQ 分布式事务实现


RocketMQ 采用事务反查机制进行实现,如果 Producer 在提交或回滚事务消息时发生异常,RocketMQ 的 Broker 没有收到提交或回滚的请求,Broker 会定期去 Producer 上反查这个事务对应的本地事务的状态,然后根据反查结果决定提交或者回滚这个事务。为了支撑这个事务反查机制,我们的业务代码需要实现一个反查本地事务状态的接口,告知 RocketMQ 本地事务是成功还是失败[1]。其中,事务消息共有三种状态,提交状态、回滚状态、中间状态:

  • TransactionStatus.CommitTransaction: 提交事务,它允许消费者消费此消息。

  • TransactionStatus.RollbackTransaction: 回滚事务,它代表该消息将被删除,不许被消费。

  • TransactionStatus.Unknown: 中间状态,它代表需要检查消息队列来确定状态。


RocketMQ 实现分布式事务的流程[1]:


代码实现

发送事务消息最重要的实现事务消息的生产者

  1. 使用 TransactionMQProducer类创建生产者,并指定唯一的 ProducerGroup

  2. 设置自定义线程池来处理这些检查请求

  3. 实现事务的监听接口,在发送半消息成功后,事务接听接口 executeLocalTransaction 方法来执行本地事务。checkLocalTransaction 方法用于检查本地事务状态,并回应消息队列的检查请求。

  4. 封装消息并通过sendMessageInTransaction发送消息。

我以订单创建和购物车系统为模板实现了RocketMQ的事务提交

参考资料

  1. 极客时间:04 | 如何利用事务消息实现分布式事务?

  2. RocketMQ:样例

  3. RocketMQ官方:消息事务样例

发布于: 58 分钟前阅读数: 2
用户头像

正向成长

关注

正向成长 2018.08.06 加入

想要坚定地做大规模数据处理(流数据方向),希望结合结合批处理的传统处理方式,以及之后流批混合处理方向进行学习和记录。

评论

发布
暂无评论
消息队列:事务实现