RocketMQ 分布式事务消息

2020-08-28  本文已影响0人  AYSAML

一、什么是事务

事务是将一次执行过程中所涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下才能提交,只要其中任一操作执行失败,都将导致整个事务的回滚。一句话来说,就是保证多个操作要么都做,要么都不做。同时一旦事务提交,则其所做的修改会永久保存到数据库。

二、事务的四个特性(ACID)

三、InnoDB 事务实现

基于衡量事务的四个特性,InnoDB 实现事务实际上就是 4 个特性的实现。

四、分布式事务的由来

现代软件架构随着业务领域划分为多个微服务,共同组成了复杂的软件系统。而从数据库层面来看,随着数据量的爆发,不得不采用分库分表的方式,降低数据库的压力。这样,就造成多个服务依赖不同的数据库,那么在同时操作的时候,如何保证事务?这就是分布式事务。

简而言之,分布式事务就是一个大的事务由不同的子事务组成,这些小的事务操作分布在不同的服务器节点上面,属于不同的微服务,分布式事务需要保证同一事务下的子事务要么全部成功,要么全部失败,即保证数据的最终一致性。

五、分布式事务解决方案

在这篇不想用太大的篇幅说一些概念上的东西,但是要说 RocketMQ 的分布式事务实现,所以在这里顺便提一下当前分布式事务的集中解决方案:

image.png

除了上述外,还有一些解决方案,比如阿里 SEATA ,SAGA方案和最大努力通知...感兴趣同学们可以自行了解,当然还有我们这篇要说的 MQ 事务。

六、MQ 事务

RocketMQ 是阿里开源的一款高性能、高吞吐量的分布式消息中间件,基于消息异步方式提供了对分布式事务的支持,实现事务最终一致性。

下面是 RocketMQ 事务消息的基本流程交互图:

image.png

如图其中分为两个流程:正常事务消息的发送及提交、事务消息的补偿流程。

1.事务消息发送及提交:

(1) 发送 half 消息。
(2) 服务端响应消息写入结果。
(3) 根据发送结果执行本地事务(如果写入失败,此时half消息对业务不可见,本地逻辑不执行)。
(4) 根据本地事务状态执行 Commit 或者 Rollback( Commit 操作生成消息索引,消息对消费者可见)

流程图如下:

image.png

2.补偿流程:

(1) 对没有 Commit/Rollback 的事务消息( pending 状态的消息),从服务端发起一次“回查”
(2) Producer收到回查消息,检查回查消息对应的本地事务的状态
(3) 根据本地事务状态,重新Commit或者Rollback

其中,补偿阶段使用定时器回查方式用于解决消息 Commit 或者 Rollback 发生超时或者失败的情况。

七、RocektMQ 事务消息的使用

如上,小伙伴们应该对 RocketMQ 的事务消息有了一定的了解,下面看下如何在开发场景下如何使用。

发送事务消息时和普通的消息区别是,自己要新建一个 TransactionMQProducer 和对应的一个 TransactionListener的实现。

this.producer = new TransactionMQProducer(config.getGroup());
    this.producer.setNamesrvAddr(config.getNameServer());
    this.producer.setExecutorService(config.getExecutorService());
    this.producer.setTransactionListener(config.getTransactionListener());

代码详见 👀 : https://github.com/wangning1018/rocketmq-transaction-message-demo

欢迎访问个人博客 获取更多知识分享。

上一篇 下一篇

猜你喜欢

热点阅读