消息队列: 事务实现
本文主要是针对消息队列中事务的实现方式的介绍。
消息队列分布式事务实现方式
RocketMQ 分布式事务实现
RocketMQ 采用事务反查机制进行实现,如果 Producer 在提交或回滚事务消息时发生异常,RocketMQ 的 Broker 没有收到提交或回滚的请求,Broker 会定期去 Producer 上反查这个事务对应的本地事务的状态,然后根据反查结果决定提交或者回滚这个事务。为了支撑这个事务反查机制,我们的业务代码需要实现一个反查本地事务状态的接口,告知 RocketMQ 本地事务是成功还是失败[1]。其中,事务消息共有三种状态,提交状态、回滚状态、中间状态:
TransactionStatus.CommitTransaction
: 提交事务,它允许消费者消费此消息。TransactionStatus.RollbackTransaction
: 回滚事务,它代表该消息将被删除,不许被消费。TransactionStatus.Unknown
: 中间状态,它代表需要检查消息队列来确定状态。
RocketMQ 实现分布式事务的流程[1]:
代码实现
发送事务消息最重要的实现事务消息的生产者
使用
TransactionMQProducer
类创建生产者,并指定唯一的ProducerGroup
。设置自定义线程池来处理这些检查请求
实现事务的监听接口,在发送半消息成功后,事务接听接口
executeLocalTransaction
方法来执行本地事务。checkLocalTransaction
方法用于检查本地事务状态,并回应消息队列的检查请求。封装消息并通过
sendMessageInTransaction
发送消息。
我以订单创建和购物车系统为模板实现了RocketMQ的事务提交
参考资料
版权声明: 本文为 InfoQ 作者【正向成长】的原创文章。
原文链接:【http://xie.infoq.cn/article/760b180c1e28b1f008b802e5c】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论