RocketMQ 分布式事务

分布式事务

先回顾一下事务,例如银行转账,A给B转100元,这个动作包括2个步骤:

  1. A账户减100元
  2. B账户加100元

把这2个步骤放在一个事务中,来保证完全成功或者完全失败。

在单体服务中,比较好解决,一个数据库事务就完成了,但在分布式系统中,这2个步骤可能是由不同的子服务分别处理,这就涉及到了分布式事务的概念。

RocketMQ 提供了对事务的支持,可以帮助我们完成分布式事务的处理。

RocketMQ 解决思路

比如事务T,包括T1和T2两个逻辑步骤,系统 A 和 B 分别执行 T1 和 T2。

A 向 RocketMQ 发送一个待确认的消息 M(这个消息不会被发送给B,RocketMQ 先保留这个消息),然后执行T1,A 根据执行结果向 RocketMQ 提交二次确认。

如果T1执行成功了,那么消息M就标记为可投递状态,B将能够接收到,B收到M后,就知道A肯定完成了T1部分的工作,B只需要保证自己完成T2即可;如果T1执行失败了,那么消息M就会被RocketMQ删除掉,B不会收到。

这样,这个分布式事务就完成了。

这个待确认的消息叫做 “half message (半消息)”。

有一个问题,如果A由于某种原因没能向RocketMQ发送二次确认怎么办?

RocketMQ有一个回查机制,就是过一段时间后,发现待确认消息还没有被确认,就会主动向producer询问,producer根据本地事务执行结果给予反馈,是成功了还是失败了。

详细步骤说明

  1. Producer 向 MQ 发送事务类型的 message。
  2. MQ 接收成功后,向 Producer 返回确认信息,这时,half message 就形成了。
  3. Producer 执行本地事务逻辑。
  4. Producer 根据本地执行结果向 MQ 进行二次确认(commit提交 或 rollback回滚),如果是 commit 那么 MQ 就让之前的 half message 变为可以被 Consumer 消费的消息,Consumer 接收消息;如果是 rollback,那么 MQ 就把之前的 half message 废弃掉。
  5. 当步骤4缺失时,MQ 找 Producer 进行回查。
  6. Producer 查看本地事务执行结果。
  7. Producer 根据步骤6的反馈,向 MQ 发送确认信息。

本文分享自微信公众号 - 性能与架构(yogoup)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏跟着阿笨一起玩NET

采用左右值编码来存储无限分级树形结构的数据库表设计

该设计方案的优点是:只用一条查询语句即可得到某个根节点及其所有子孙节点的先序遍历。由于消除了递归,在数据记录量较大时,可以大大提高列表效率。但是,这种编码方案由...

67910
来自专栏緣來來來

Django配置缓存机制

Django 官方关于cache的介绍:https://docs.djangoproject.com/en/dev/topics/cache/

18510
来自专栏java一日一条

SQL数据库面试题以及答案

S#:学号;Sname:学生姓名;Sage:学生年龄;Ssex:学生性别 Course(C#,Cname,T#) 课程表

73210
来自专栏黄Java的地盘

IndexedDB使用与出坑指南

本文通过对IndexedDB的使用方法和使用场景进行相关介绍,对常见的问题进行解答。

3.5K20
来自专栏沈唁志

2018年韩创科技旗下我图网PHP工程师面试题分享

4. 一张采用Innodb的User表,其中id为主键,name为普通索引,试从索引的数据结构角度分析,以下两条语句(均返回一条记录)在检索过程中有哪些区别

20620
来自专栏java一日一条

程序员,你的安全感呢?

最近跟一位同事谈心,他非常热爱技术,是一个不折不扣的极客,不仅如此他有很强的执行力,并能持之以恒,从他的身上我看到了未来几年将会成长起来的一个技术牛人。但是,他...

7830
来自专栏緣來來來

Django添加sitemap功能

1、启用sitemap 在django的settings.py的INSTALLED_APPS中添加

15310
来自专栏java一日一条

Java Web应用中调优线程池的重要性

不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求。线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的。本文主要介绍...

13210
来自专栏林德熙的博客

安装 wordpress 出现 抱歉,我不能写入wp-config.php文件 下载 wordpress安装

本文告诉大家如何安装 wordpress ,在安装过程出现 抱歉,我不能写入wp-config.php文件如何解决

31410
来自专栏緣來來來

安卓基础干货(三):安卓数据库的学习

title: 安卓基础干货(三):安卓数据库的学习 copyright: true categories: 安卓基础干货 date: 2018-01-10 19...

13220

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励