之前讲过有关分布式事务2PC、3PC、TCC的理论知识,博客地址:

1、分布式事务(1)---2PC和3PC原理

2、分布式事务(2)---TCC原理

这篇讲有关RocketMQ实现分布式事务的理论知识,下篇也会示例 通过SpringCloud来实例RocketMQ实现分布式事务的项目。

一、举个分布式事务场景

列子:假设 A 给 B 转 100块钱,同时它们不是同一个服务上。

目标:就是 A 减100块钱,B 加100块钱。

实际情况可能有四种:

1)就是A账户减100 (成功),B账户加100 (成功)2)就是A账户减100(失败),B账户加100 (失败)3)就是A账户减100(成功),B账户加100 (失败)4)就是A账户减100 (失败),B账户加100 (成功)

这里 第1和第2 种情况是能够保证事务的一致性的,但是 第3和第4 是无法保证事务的一致性的。

那我们来看下RocketMQ是如何来保证事务的一致性的。

二、RocketMQ实现分布式事务原理

RocketMQ虽然之前也支持分布式事务,但并没有开源,等到RocketMQ 4.3才正式开源。

1、基础概念

最终一致性

RocketMQ是一种最终一致性的分布式事务,就是说它保证的是消息最终一致性,而不是像2PC、3PC、TCC那样强一致分布式事务,至于为什么说它是最终一致性事务下面会详细说明。

Half Message(半消息)

是指暂不能被Consumer消费的消息。Producer 已经把消息成功发送到了 Broker 端,但此消息被标记为暂不能投递状态,处于该种状态下的消息称为半消息。需要 Producer

对消息的二次确认后,Consumer才能去消费它。

消息回查

由于网络闪段,生产者应用重启等原因。导致 Producer 端一直没有对 Half Message(半消息) 进行 二次确认。这是Brock服务器会定时扫描长期处于半消息的消息,会

主动询问 Producer端 该消息的最终状态(Commit或者Rollback),该消息即为 消息回查

2、分布式事务交互流程

理解这张阿里官方的图,就能理解RocketMQ分布式事务的原理了。

我们来说明下上面这张图

1、A服务先发送个Half Message给Brock端,消息中携带 B服务 即将要+100元的信息。2、当A服务知道Half Message发送成功后,那么开始第3步执行本地事务。3、执行本地事务(会有三种情况1、执行成功。2、执行失败。3、网络等原因导致没有响应)4.1)、如果本地事务成功,那么Product像Brock服务器发送Commit,这样B服务就可以消费该message。4.2)、如果本地事务失败,那么Product像Brock服务器发送Rollback,那么就会直接删除上面这条半消息。4.3)、如果因为网络等原因迟迟没有返回失败还是成功,那么会执行RocketMQ的回调接口,来进行事务的回查。

从上面流程可以得知 只有A服务本地事务执行成功 ,B服务才能消费该message

然后我们再来思考几个问题?

为什么要先发送Half Message(半消息)

我觉得主要有两点

1)可以先确认 Brock服务器是否正常 ,如果半消息都发送失败了 那说明Brock挂了。2)可以通过半消息来回查事务,如果半消息发送成功后一直没有被二次确认,那么就会回查事务状态。

什么情况会回查

也会有两种情况

1)执行本地事务的时候,由于突然网络等原因一直没有返回执行事务的结果(commit或者rollback)导致最终返回UNKNOW,那么就会回查。2) 本地事务执行成功后,返回Commit进行消息二次确认的时候的服务挂了,在重启服务那么这个时候在brock端它还是个Half Message(半消息),这也会回查。

特别注意: 如果回查,那么一定要先查看当前事务的执行情况,再看是否需要重新执行本地事务。

想象下如果出现第二种情况而引起的回查,如果不先查看当前事务的执行情况,而是直接执行事务,那么就相当于成功执行了两个本地事务。

为什么说MQ是最终一致性事务

通过上面这幅图,我们可以看出,在上面举例事务不一致的两种情况中,永远不会发生

A账户减100 (失败),B账户加100 (成功)

因为:如果A服务本地事务都失败了,那B服务永远不会执行任何操作,因为消息压根就不会传到B服务。

那么 A账户减100 (成功),B账户加100 (失败) 会不会可能存在的。

答案是会的

因为A服务只负责当我消息执行成功了,保证消息能够送达到B,至于B服务接到消息后最终执行结果A并不管。

那B服务失败怎么办?

如果B最终执行失败,几乎可以断定就是代码有问题所以才引起的异常,因为消费端RocketMQ有重试机制,如果不是代码问题一般重试几次就能成功。

如果是代码的原因引起多次重试失败后,也没有关系,将该异常记录下来,由人工处理,人工兜底处理后,就可以让事务达到最终的一致性。

分布式事务:RocketMQ实现分布式事务原理相关推荐

  1. 阿里P8架构师谈:分布式事务的解决方案,以及原理、总结

    分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在这几年越来越火的微服务架构中,几乎可以说是无法避免,本文就围绕分布式事务各方面与大家进行介绍. 事务 1. ...

  2. SpringCloud Alibaba 2021微服务实战三十二 集成RocketMQ实现分布式事务

    目录 基于RocketMQ分布式事务 - 完整示例 2.解决方案 2.1.本地消息表方案 2.2.RocketMQ事务消息方案 一.事务消息 二.订单服务 1.事务日志表 2.TransactionM ...

  3. 【RocketMQ】【分布式事务】使用RocketMQ实现分布式事务

    参考地址:https://blog.csdn.net/zyw23zyw23/article/details/79070044 视频地址:https://v.youku.com/v_show/id_XO ...

  4. 搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务

    搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务 初步认识RocketMQ的核心模块 rocketmq模块 rocketmq-broker:接受生产者发来的消息并存储(通过调用rocke ...

  5. rocketmq整合mysql事务_分布式事务(4)---RocketMQ实现分布式事务项目

    摘要: ,但是returnLocalTransactionState.COMMIT_MESSAG的时候*服务挂了,那么最终Brock还未收到消息的二次确定,还是个半消息,所以当重新启动的时候还是回调这 ...

  6. 阿里分布式事务框架Seata,AT模式原理解析

    什么是分布式事务 如今在分布式技术盛行下,许多公司都已经在使用分布式技术了,虽然分布式技术给我们项目带来了三高(高可用,高扩展,高性能)等优点,但是缺点也很明显,分布式项目一般都是分服务开发,且多个服 ...

  7. 【分布式技术专题】「分布式技术架构」一文带你厘清分布式事务协议及分布式一致性协议的算法原理和核心流程机制(上篇)

    背景介绍 最近大家都相比遇到了就业瓶颈了,很多公司要不就是不招人了,要不就是把门槛抬的很高,所以针对于一些分布式角度而言的技术知识点,更是必备条件以及重中之重了.那么今天笔者就针对于分布式协议以及一些 ...

  8. 分布式事务(阿里巴巴RocketMQ实现分布式事务)

    1 RokcetMQ是什么? Apache RocketMQ是一个采用Java语言开发的分布式的消息系统,由阿里巴巴团队开发,与2016年底贡献给Apache,成为了Apache的一个顶级项目. 在阿 ...

  9. RocketMQ的Producer详解之分布式事务消息(回顾事务)

    回顾什么事务 聊什么是事务,最经典的例子就是转账操作,用户A转账给用户B1000元的过程如下: 用户A发起转账请求,用户A账户减去1000元 用户B的账户增加1000元 如果,用户A账户减去1000元 ...

最新文章

  1. linux下的文件和文件夹的权限问题
  2. 如何使用JavaScript漂亮地打印JSON?
  3. 【网友的】《一个程序猿的生命周期》读后感
  4. 多少分才能考上重庆计算机学校,重庆多少分能上985大学?重庆985院校分数线是多少?(2021年参考)...
  5. 「分块系列」数列分块入门3 解题报告
  6. zabbix server 迁移步骤
  7. 如何通过图片识别用的什么字体?
  8. cifar10数据集_pytorch入门(四)-数据
  9. IP基础及ping命令
  10. Julia: arrow,一种革命性的数据格式
  11. 三子棋游戏(C语言实现)
  12. iOS 常用三方集合
  13. 2019滴滴java面试总结 (包含面试题解析)
  14. 小技巧-不使用js制作高级足球比赛赛程表
  15. 二十四节气-大寒海报、文案分享。冬寒终有尽,春暖海先觉。
  16. 湖北科技学院计算机科学院,钱涛 - 湖北科技学院 - 计算机科学与技术学院
  17. MATLAB实现变限积分函数的积分/ 多重积分/ 如何解决求积分显示AB浮点标量报错
  18. 【java并发探赜索隐】判断标志、死锁、守护进程
  19. 苹果Mac电脑怎么删除文件
  20. BatchNorm和LayerNorm的比较

热门文章

  1. K8s报错#!/bin/bash yum install -y yum-utils device-mapper-persistent-data lvm2 if [ $? = 0 ];then echo
  2. 在windows上linux命令行,如何在Windows中通过Cygwin来使用Linux命令行
  3. c语言二级指针有什么作用,C语言中二级指针的实例详解
  4. oracle语句借书,Oracle SQL题目及其解答(借书卡、图书、借书记录)
  5. 安装mysql查看随机密码命令_linux安装mysql-8.0.21-1.el7.x86_64.rpm-bundle - 君主-bye
  6. java 状态机_基于 RAFT 一致性算法的 Java 实现 SOFAJRaft
  7. java中什么方法用来清空流_这个真的写的很细,JavaIO中的常用处理流,看完只有10%的人还不懂了...
  8. cpu风扇转速慢_cpu风扇简介有哪些?cpu风扇选购技巧介绍_
  9. linux命令菜鸟ping,Linux ping命令
  10. mysql mybatis模糊查询语句_详解MyBatis模糊查询LIKE的三种方式