# 《Seckill秒杀系统》第51章:基于可靠消息最终一致性模型解决分布式事务问题

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★★☆☆
  • 本章重点:重点理解并掌握可靠消息最终一致性模型解决分布式事务问题的流程,并能够将其灵活运用到自身实际项目中。

大家好,我是冰河~~

在互联网高并发、大流量的业务场景中,一般不会使用强一致性模型来处理分布式事务,当然,金融业务除外,金融业务对数据的一致性要求极高,首要考虑的就是数据的一致性问题。而其他场景或多或少允许数据出现短暂时间的不一致问题。像秒杀系统这种瞬时高并发、大流量的业务场景,就比较适合使用可靠消息最终一致性模型来解决分布式事务问题。

注意:如果想系统、深入的学习分布式事务相关的知识,可以阅读《深入理解分布式事务:原理与实战 (opens new window)》一书。

# 一、前言

秒杀系统截止到目前已经基于两种方案解决了分布式事务问题,一种是TCC分布式事务解决方案,另一种是AT分布式事务解决方案,但是这两种方案多多少少会影响性能,对于秒杀系统来说,除了数据的一致性问题外,我们还要考虑性能问题。

# 二、本章诉求

在前面的文章中,我们基于Dromara社区的Hmily开源框架使用TCC模型解决了分布式事务问题,也基于阿里巴巴开源的Seata框架使用AT模型解决了分布式事务问题。今天我们就一起在秒杀系统中实现另一种分布式事务解决方案,那就是使用可靠消息最终一致性模型来解决分布式事务问题。

# 三、可靠消息最终一致性解决方案

可靠消息最终一致性分布式事务解决方案总体上可以分成三大类:本地消息表、独立消息服务和事务消息。关于这三种可靠消息最终一致性分布式事务解决方案的模型和原理,大家可以阅读《深入理解分布式事务:原理与实战 (opens new window)》一书。这里,我们再重点聊聊RocketMQ的事务消息。

# 3.1 RocketMQ简单概述

RocketMQ是阿里巴巴开源的一款支持事务消息的消息中间件,于2012年正式开源,2017年成为Apache基金会的顶级项目。RocketMQ的高可用机制以及可靠消息设计能够为事务消息在系统发生异常时保证事务达到最终一致性。

# 3.2 RocketMQ事务消息原理

RocketMQ主要由Producer端和Broker端组成。RocketMQ的事务消息主要是为了让Producer端的本地事务与消息发送逻辑形成一个完整的原子操作,即Producer端的本地事务和消息发送逻辑要么全部执行成功,要么全部不执行。在RocketMQ内部,Producer端和Broker端具有双向通信能力,使得Broker端具备事务协调者的功能。RockertMQ提供的消息存储机制本身就能够对消息进行持久化操作,这些可靠的设计能够保证系统出现异常时,依然能够保证事务最终达到一致性。

RocketMQ 4.3版本之后引入并实现了完整的事务消息机制,其内部实现了完整的本地消息表逻辑,使用RocketMQ实现可靠消息分布式事务就不用自己再实现本地消息表的逻辑了,极大地减轻了开发工作量。

使用RocketMQ实现可靠消息分布式事务解决方案的基本原理如图51-1所示。


# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码