四种基于MQ的分布式事务解决方案

news2025/1/12 5:58:13

在微服务的时代,分布式事务是绕不开的话题,尽管在大多数场景下,我们并不需要使用分布式事务,但是 不需要使用 不代表 可以不会使用,万一哪天真需要用到了呢?分布式事务是一个比较大的话题,今天我们来看看基于MQ的分布式事务解决方案。

在实际开发中,为了简化分布式事务,我们和其他服务交互,经常会采用MQ的方式,我们先来看下如果采用MQ的方式和其他服务进行交互,应该怎么做。

采用MQ的方式和其他服务进行交互

基于RocketMQ 事务消息+最大努力通知

RocketMQ提供了事务的消息的功能,我们来看下事务消息的原理:

  1. Producer发送一个半消息到Broker;
  2. Broker收到半消息后,响应Producer,Broker会将半消息存储到一个特殊的Topic,此时Consumer是不能消费此消息的;
  3. Producer执行本地事务;
  4. Producer根据本地事务的执行情况,告知Broker Commit或者Rollback,如果Commit,Broker会将消息投递到正常的Topic,此时Consumer可以正常消费此消息。

如果因为某种原因,Broker未收到Producer的Commit或者Rollback,Broker会发起回查,Producer收到回查请求后,根据本地事务状态,重新响应Broker Commit或者Rollback。

对于Producer而言,本地事务和发送消息是一致的,要么都成功,要么都失败,但是无法保证Consumer的一致性,有不少人称之为“单端事务”,但是RocketMQ还为Consumer提供了重试的功能,只要Consumer不返回消息消费成功,Consumer还有16次机会可以重新消费此消息,执行自身的业务操作,相当于最大努力通知。

这个方案可以说是最常用的分布式事务解决方案了,不管是实现,还是原理都比较简单,但是仔细想想此方案还是有缺点的:

  1. 和RocketMQ强绑定,因为只有RocketMQ才提供了完善的事务消息的功能;
  2. 降低了可用性,如果Producer发送半消息失败,流程就终止了;
  3. 代码侵入性强,Producer需要提供执行本地事务、回调两个方法。

基于本地消息表

此方案在RocketMQ事务消息推出之前,是采用较多的一个分布式事务解决方案,需要在库中新建一张本地消息表,此表有如下核心字段:

  • topic:消息需要发送到哪个topic;
  • state:消息状态,有三种状态:1.未发送 2.发送失败 3.发送成功;
  • retry_num:重试次数;
  • time:消息产生的时间;
  • last_retry_time:最近重试时间;
  • message:消息内容。

作为Producer来说,原本是执行完本地业务后,直接将消息投递到MQ,现在需要将消息保存至本地消息表,然后由定时任务读取本地消息表,将需要推送的消息投递到MQ,具体做法如下:

  1. 本地业务+插入本地消息表 组成一个大的本地事务,以此保证两者的原子性、一致性,本地业务+插入本地消息表两个操作要么同时成功,要么同时失败;
  2. 新增定时任务,不断的扫描本地消息表,将未成功投递的消息进行投递,投递成功,修改本地消息表的状态字段,投递失败,修改本地消息表中的状态,并且重试次数+1,等待下一次重新投递。

这个方案实现也非常简单,缺点也显而易见:

  1. 严重依赖Job;
  2. 及时性比较差,如果Job每10分钟运行一次,那可能就有10分钟的延迟。如果Job每5分钟运行一次,那可能就有5分钟的延迟。
  3. 不断的扫描本地消息表,对数据库也是一种压力;
  4. 需要定期清理本地消息表。

基于内存队列+本地消息表

本地消息表这个方案还是不错的,有没有办法改善它的缺点呢?当然有,这个方案就是对传统的本地消息表方案进行了改造,据说部分二三线互联网公司就是采用的此种方案,具体看图(如果图片看不清,可以将图片下载到本地 或者 在新标签页中查看图片):

虽然此方案需要自己编码实现,但是整体来说,编码难度不大。

不管是基于RocketMQ事务消息的分布式事务解决方案,还是基于本地消息表的分布式事务解决方案,还是基于内存队列+本地消息表的分布式事务解决方案,都有消息表的概念,只是消息表的具体存在形式不同,一个是以数据表的形式存在(存在了数据库),一个是以Topic的形式存在(存在了Broker)。

以上三种方案都有一个局限性:和其他服务进行交互,必须比较采用MQ的方式。

不采用MQ的方式和其他服务进行交互

基于RocketMQ的延迟消息检查方案

上述三个方案,都有一个局限性:和其他服务进行交互,必须采用MQ的方式,如果不满足这个条件,如何采用MQ的方式来实现分布式事务呢:采用基于RocketMQ的延迟消息检查方案。

  1. Producer发送延迟消息;
  2. 其他服务需要提供检查接口,重试或者回滚接口;
  3. Producer收到延迟消息后,检查自身的业务操作是否执行成功,根据具体情况,判断是否需要重试或回滚,然后调用其他服务提供的检查接口,检查其他服务的业务操作是否执行成功,再根据具体的情况判断是否调用其他服务提供的重试、回滚接口。

此方案实现也比较简单,且容易理解,但是也有缺点:

  1. 和RocketMQ强绑定,因为只有RocketMQ才提供了完善的延迟消息的功能;
  2. 降低了可用性,如果Producer发送延迟消息失败,流程就终止了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/76267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1426827-79-3,endo-BCN-NHS ester,endo-BCN-NHS 活性酯

endo-BCN-NHS ester试剂反应原理: BCN基团与叠氮化物标记的生物分子反应,NHS酯可用于标记蛋白质的伯胺(-NH2)、胺修饰的寡核苷酸和其他含胺分子,西安凯新生物科技有限公司下面为大家整理分享。​endo-BCN-NHS ester物理…

Python学习基础笔记三十二——正则表达式

官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特殊字符、及这些特定字符的组合,组成一个“规则字符串”,这个规则字符串用来表达对字符串的一种过滤逻辑。 1、在Linux运维中,vi、grep、awk…

fiddler使用的作用与常见应用场景

Fiddler工具的工作原理 1.本地应用与服务器之间所有的Request 和Response都将经过Fiddler,由Fiddler进行转发,此时Fiddler以代理服务器的方式存在。 2.由于所有的网络数据都会经过Fiddler,因此Fiddler能够截获这些数据,实现网络…

美团四面 Java 岗,终获 offer,我是这么回答面试官的

前言 经历了 10 月的疫情挣扎与 11 月失业的煎熬,终于来到了春末的 12 月,内心的压力也稍稍的松懈了一些,终于可以放心找个工作了,可是随着的等待面试的机会的越来越少,这份焦虑反而越来越大,也偶尔会想&a…

稳定性建设之JavaScript代码不能被阻断

稳定性建设之JavaScript代码不能被阻断 背景 js代码可能会因为某些原因,导致出错,进而整个后续代码有可能都被阻断。直接影响线上的稳定性 最常见的js被阻断的情况 console.log(111) // 预期 a {} // 结果 a undefined a.a 1 console.log(222) // …

Pycharm的简单介绍以及api的使用

一、什么是Pycharm? Pycharm是一种python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、脚本控制。此外,该IDE提供了一些高级功…

MyBatis-Plus中自动填充功能的用法

系列文章目录 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus之ActiveRecord[基础增删改查操作]_心态还需努力呀的博客-CSDN博客 MyBatis-Plus分页查询(快速上…

【JavaWeb开发-Servlet】day06-学生成绩管理系统-实现分页功能

目录 一、前端设计 二、分页功能 ①创建实体层 ②在DAO层新建两个方法 ③编写业务层 ④实现Servlet层 ⑤修改前端页面 ⑥测试 ⑦思路 ⑧扩展 一、前端设计 原来的前端非常简陋,没有明显的突出其功能,下面将对前端页面进行新的完善。 写一个标题…

HPPH-DSPE-PEG/NH2/MAL光克洛-磷脂-聚乙二醇/光克洛-聚乙二醇-氨基/马来酰亚胺

小编今天和大家一起来学习HPPH-DSPE-PEG/NH2/MAL光克洛-磷脂-聚乙二醇/光克洛-聚乙二醇-氨基/马来酰亚胺相关研究内容! 光克洛,第二代的光敏剂,可用于光动力疗法 (PDT),基本结构为二氢卟吩类化合物。美国研究人员从绿色植物中提取、纯化&…

nginx笔记

作者:ThinkStu 文章目录一、简介二、常用配置1、listen2、server_name3、location4、sendfile5、nodelay/push6、add_header7、set 变量8、if9、return10、keepalive三、常用操作1、Gzip压缩2、正则表达式3、rewrite重写4、rewrite范例5、跨域6、防盗链7、适配移动设…

R语言数据可视化分析案例:探索BRFSS数据

最近我们被客户要求撰写关于BRFSS数据的研究报告,包括一些图形和统计输出。 加载包 library(tidyr) library(knitr) opts_chunk$set(echo TRUE, fig.align "center") 载入资料 load("brfss2013.RData")第1部分:数据 描述如何收…

Spring Boot ActuatorAdmin

Spring Boot Actuator&Admin 指标监控简介 干嘛的: 主要运用在微服务架构,所以我建议你先学微服务,否则可能get不到它的用处,只有大型的分布式系统才会用到指标监控… Why:? 对于一个大型的几十个、…

低代码如何自定义主题?一文教会你

SuccAP低代码开发平台,除了提供了多主题供选择外,还支持自定义报表主题,当系统自带的主题无法满足项目需求时,可以根据项目设计并新增主题,本文将介绍如何去新增自定义主题。 新增自定义主题可按如下步骤操作&#xf…

APS高级计划排程在乳制品行业的应用

目前乳制品行业供应链管理中存在的主要问题 生产盲目性,应对市场变化能力不足。现如今牛奶已经成为人们日常饮食需求的必需品,很多生产厂家就开始大量的生产,全然不顾市场的需求度,应对市场变化的能力不足,导致了有一…

计算机毕业设计ssm+vue基本微信小程序的心理服务平台 uniapp 小程序

项目介绍 随着计算机技术的发展,带来社会各行业的进步,信息化逐渐运用到人们的生活中。传统模式的青少年心理健康管理满足不了现代人的生活追求,服务质量、服务速度,之前的很多网站由于功能、或者框架设计等原因,无法完美的展现它的特色,优势,浪费了很多资源。使用管理系统进行…

今天步行数5000多

今天步行数量比较多的,有五千多步吧,希望明天能继续保持下去。

企业知识分享系统的设计与实现

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&…

两种方案解决vscode浏览器跨域问题

一、 问题 1.1 在接收 json 数据的时候出现了以下错误; 打开测试用的 json 文件发现数据并没有问题,而第一个报错可以看到 Cross origin requests are only supported for protocol schemes:… ,也就是说所使用的数据不在跨域的许…

毕业后5年,我终于变成了月薪13000的软件测试工程师

目录 我为什么选择转行 工作环境 我选择了转行软件测试 写在最后 《软件测试工程师发展规划路线》 一、测试基础 了解测试的基础技能,掌握主流缺陷管理工具的使用,熟练测试环境的操作与运维 二、Linux必备知识 Linux作为现在最流行的软件环境系…

场景案例│数字员工助力医疗行业打通信息系统壁垒,实现高效率运营

据埃森哲研究预测,到2026年人工智能技术每年将为医疗保健行业节省1500亿美元。 随着人们对数字化的需求日益增长,数字技术成为转型升级的新兴力量,许多医疗机构积极采用数字员工推进数字化转型的步伐。 在数字员工的支持下,医疗…