MQ选手终极对决:比较几个主流MQ实现分布式事务的方案

news2024/10/6 8:26:14

1、MQ实现分布式事务

在分布式事务的实现中,ACK消息和半消息是两种实现分布式事务的两种不同机制,它们的共同点是都使用了两阶段提交的机制,但是它们的实现细节和适用场景有所不同。具有一些区别和特点。下面是ACK消息和半消息在实现分布式事务方面的比较:

ACK消息(Acknowledgement):

  • ACK消息是指在分布式事务中,消息的接收者(消费者)在成功处理消息后发送ACK(确认)给消息的发送者(生产者)。
  • 生产者发送消息后,需要等待消费者发送ACK以确认消息已被正确处理。
  • 如果消息未收到ACK确认,生产者可以选择重新发送消息,以确保消息的可靠性。
  • ACK消息的机制能够确保消息的可靠性和一致性,但需要依赖消费者的可用性和稳定性。

使用 ACK 消息实现分布式事务时,需要将发送消息的操作包含在本地事务中,并在本地事务提交后发送 ACK 消息来确认消息的发送。这种方式可以确保发送消息与本地事务的原子性,从而实现分布式事务的一致性和可靠性。

半消息(Half-Message):

  • 半消息是一种通过消息队列实现分布式事务的机制,通常使用消息队列的事务功能或消息可靠性机制来实现。
  • 在半消息中,事务的操作被拆分为两个步骤:发送半消息和确认半消息。
  • 发送半消息时,消息被发送到消息队列,但不会立即被消费。此时消息处于待确认状态。
  • 在执行本地事务逻辑后,如果成功,发送确认消息,消息队列将正式将半消息标记为可消费的状态,最终被消费者消费。
  • 如果本地事务逻辑失败,可以选择不发送确认消息,使半消息超时或被丢弃,实现事务的回滚操作。
  • 半消息的机制能够确保分布式事务的可靠性和一致性,不需要依赖消费者的可用性。

在比较上述两种机制时,关键点在于可靠性和一致性的保证。ACK消息通过消费者的ACK确认实现可靠性,但依赖于消费者的可用性和稳定性。半消息通过消息队列的事务或可靠性机制实现可靠性和一致性,不依赖于消费者的确认。同时,半消息机制还可以支持分布式事务的回滚操作。

具体选择使用ACK消息还是半消息取决于应用场景的需求和特点。需要综合考虑消息可靠性、性能、消费者的可用性要求以及事务回滚的需求等因素。

ACK 消息方式需要应用程序更主动地处理消息发送和确认,而半消息方式由消息中间件负责协调事务状态

2、MQ中间件实现分布式事务原理

2.1、Rocketmq

RocketMQ 实现分布式事务的核心思想是使用两阶段提交(Two-Phase Commit,简称 2PC)的协议来确保消息的事务性和一致性。

具体来说RocketMQ使用了半消息事务监听器两个概念来实现。以下是 RocketMQ 实现分布式事务的核心思想和步骤:

  1. 事务消息发送:
  • 在分布式事务中,应用程序将需要发送的事务消息发送到 RocketMQ。
  • 发送的消息处于半消息(Half-Message)状态,表示事务尚未提交。

2.执行本地事务逻辑:

  • 在消息发送后,应用程序执行与消息相关的本地事务逻辑,例如数据库操作或其他操作。

3.提交事务:

  • 如果本地事务逻辑执行成功,应用程序发送消息的确认请求给 RocketMQ。
  • RocketMQ 接收到确认请求后,会将半消息标记为可提交状态。

4.回查确认:

  • 在提交事务后,RocketMQ 会进行回查确认(Check Confirm)机制,以确保分布式事务的一致性。
  • RocketMQ 会向应用程序发送回查请求,要求应用程序确认事务的最终状态。

5.确认事务:

  • 应用程序接收到回查请求后,根据本地事务的状态进行确认。
  • 如果本地事务执行成功并确认提交,则应用程序发送确认请求给 RocketMQ,将半消息标记为已提交。
  • 如果本地事务执行失败或确认回滚,则应用程序发送确认请求给 RocketMQ,将半消息标记为已回滚。

通过以上步骤,RocketMQ 实现了分布式事务的核心思想。它使用两阶段提交的协议,在消息发送阶段和确认阶段进行交互,以确保事务消息的可靠性和一致性。

需要注意的是,RocketMQ 的分布式事务还涉及到消息回查和事务状态的管理。如果在回查确认阶段应用程序无法收到回查请求,RocketMQ 会根据预设的超时时间进行自动处理,将未确认的消息标记为回滚。

RocketMQ 实现分布式事务的核心思想是使用两阶段提交协议,通过消息发送、本地事务执行和确认回查等步骤来确保事务消息的一致性和可靠性。

2.2、Rabbitmq

RabbitMQ实现分布式事务的核心思想是基于消息确认死信队列,来保证消息的可靠传递和消费。

具体来说RabbitMQ使用了生产者确认消费者确认两个机制来实现。以下是 RabbitMQ 实现分布式事务的核心思想和步骤:

  1. 消息发送阶段:
  • 在分布式事务中,应用程序将需要发送的消息通过 RabbitMQ 的 Channel(信道)发送到指定的 Exchange(交换机)和 Routing Key(路由键)。
  • 在这个阶段,消息被发送到 RabbitMQ,但并没有立即被消费。

2.确认阶段:

  • 在消息发送阶段之后,应用程序执行与消息相关的本地事务逻辑,例如数据库操作或其他外部系统的调用。
  • 如果本地事务逻辑执行成功,应用程序会发送确认消息给 RabbitMQ,表示消息可以被正式处理。
  • 如果本地事务逻辑失败,应用程序可以选择不发送确认消息,使消息超时或被丢弃,实现事务的回滚操作。

通过将事务操作拆分为发送消息和确认消息两个阶段,RabbitMQ 实现了分布式事务的思想。这样做的好处是,发送消息是一个轻量级的操作,不需要等待本地事务的执行结果,从而提高了消息的吞吐量和性能。

需要注意的是,为了保证分布式事务的可靠性和一致性,应用程序需要处理好异常情况,例如本地事务逻辑失败、网络故障或应用程序崩溃等。在这些情况下,应用程序应该有相应的机制来处理未确认的消息,以避免数据不一致性。RabbitMQ 实现分布式事务的核心思想是将事务操作拆分为消息发送和确认两个阶段,通过确认消息的方式来实现事务的提交或回滚,从而确保分布式系统的数据一致性。

2.3、Kafka

以下是一种常见的方法,称为"Kafka事务处理",可以用来实现分布式事务:

  1. 开启Kafka事务:在生产者端,可以通过调用initTransactions()方法来开启Kafka事务。这将为当前线程关联一个事务ID,并将生产者置于事务模式。
  2. 开始事务:生产者可以调用beginTransaction()方法来开始一个新的事务。在这之后,所有发送到Kafka主题的消息都将与该事务相关联。
  3. 发送消息:在事务中,通过调用send()方法发送消息到Kafka主题。这些消息不会立即提交到主题,而是在事务提交之前缓存在生产者端。
  4. 执行其他操作:在事务中,你可以执行其他的操作,比如查询数据库、调用其他服务等。
  5. 提交事务:一旦所有的消息都发送完成,你可以调用commitTransaction()方法来提交事务。这将把所有缓存在生产者端的消息一起提交到Kafka主题。
  6. 处理事务回滚:如果在事务过程中发生了错误或者需要回滚事务,你可以调用abortTransaction()方法来中止当前事务。这将清除生产者端缓存的消息,使其不会提交到Kafka主题。

需要注意的是,消费者端也可以参与到分布式事务中,以确保在消费消息的过程中保持事务的一致性。

=============================

如果文章对你有帮助,请不要忘记加个关注、点个赞!

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

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

相关文章

暑期旅游市场火热,旅游行业如何做好邮件营销

随着2023年全国高考结束,以及各大高校毕业生也将陆续告别校园,许多学生都会用一场具有庆贺、欢聚意义的毕业旅游来为自己的高中生涯或大学生涯画上完美句号。携程数据显示,6月9日至8月底,高中和大学毕业生的旅游订单逐渐增多&…

QT 5.9.9 配置使用 MYSQL5.7 数据库

目录 Mysql下载安装 QT 下载安装 编译MYSQL mingw构建方式 msvc构建方式 QT中MYSQL测试使用 因为版权问题,Qt本身不自带Mysql数据库的驱动,因此如果想要借用Qt操作Mysql数据库,需要手动进行编译。 Mysql下载安装 【Qt】 Mysql服务端安装…

抖音seo账号矩阵系统源码搭建服务器内耗量?

一、短视频账号矩阵系统视频库存量技术云端如何处理? 1.抖音SEO账号矩阵系统源码搭建服务器内耗量怎么后端处理 非常低,可以轻松应对大量用户使用。通过服务器的高效运行,系统可以提供稳定的服务,并且快速响应用户的操作。源码搭…

2023年软件测试这个行业怎么样?

今天我要从一个新的角度来论述软件测试行业怎么样。 最近热搜新闻是张雪峰最近抨击的“新闻专业不要报,建议把孩子打晕后,随便选个专业都比新闻好”,重庆大学新闻学教授发文抨击张雪峰偏激言论,眼睛雪亮的人民群众却纷纷站队张雪…

C#复制构造函数学习

通过从另一个对象复制变量或将一个对象的数据复制到另一个对象来创建对象的构造函数称为复制构造函数。 复制构造函数是一个参数化构造函数,包含相同类类型的参数。它的主要用途是将新实例初始化为现有实例的值。 using System;namespace Mytest{class User {publi…

非凸科技金牌赞助“第三届中国Rust开发者大会”

6月17-18日,由Rust中文社区主办的“第三届中国Rust开发者大会”在上海圆满举行。非凸科技作为金牌赞助商,全力协助大会顺利开展,共同为中国 Rustaceans带来一场技术交流盛宴。 本次大会演讲主题内容广泛,涉及编程语言、量化金融、…

springboot mybatis-plus慢sql输出日志,log4jdbc使用

前言 无论使用原生JDBC、mybatis还是hibernate,使用log4j等日志框架可以看到生成的SQL,但是占位符和参数总是分开打印的,不便于分析,显示如下的效果: Log4jdbc 是一个开源 SQL 日志框架,它使用代理模式实现对常用的…

C++之operator重载运算符应用(一百四十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

采集发布到WordPress指定文章作者

采集的数据发布到wordpress系统网站,指定发布文章的作者设置方法教程。 目录 1. 获取用户名 2. 对接采集器指定作者 3. 随机作者 1. 获取用户名 进入Wordpress系统后台,点击控制台左侧菜单的【用户】,再点击展开列表的【所有用户】&…

word2vec self-attention transformer diffusion的技术演变

这一段时间大模型的相关进展如火如荼,吸引了很多人的目光;本文从nlp领域入门的角度来总结相关的技术路线演变路线。 1、introduction 自然语言处理(Natural Language Processing),简称NLP。这个领域是通过统计学、数…

使用homebrew安装RabbitMQ3.12.XX版本无法启动的解决方案

使用brew安装RabbitMQ3.12.XX版本遇到无法启动的天坑 首先来看RabbitMQ 3.12.0的新版说明,这也是我为什么无法启动的原因 所需的功能标志 RabbitMQ 3.12.0 将要求在升级前启用 3.11.x 系列版本的所有功能标志、 类似于 3.11.0 要求在 3.9.0 之前引入的所有功能标…

Android SDK file not found: F:\androidSDK\build-tools\34.0.0\aapt

问题表现 执行flutter doctor 的时候,报错Android SDK file not found,很明确的说没有配置 30.0.3 问题解决 首先去报错的SDK路径中排查是否有这个版本。发现有,但是是个空文件夹,所以删除掉该文件夹重新运行 flutter doctor &a…

【大语言模型】5分钟了解预训练、微调和上下文学习

5分钟了解预训练、微调和上下文学习 什么是预训练?什么是微调?什么是上下文学习?相关资料 近年来大语言模型在自然语言理解和生成方面、多模态学习等方面取得了显著进展。这些模型通过 预训练、 微调和 上下文学习的组合来学习。本文将快速…

JWT数字签名与token实现

JWT介绍 官方介绍 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。 什么时候你应该用JSON Web Token &#xf…

python爬虫—selenium获取csdn质量分并用echarts可视化分析

文章目录 ⭐前言⭐selenium💖 获取所有的文章url💖 根据url查询分数💖 inscode结合echarts展示结束 ⭐前言 大家好,我是yma16,本文分享关于python自动化获取个人博客质量分并可视化。 该系列文章: python爬…

MATLAB App Designer基础教程 Matlab GUI入门(一)

MATLAB GUI入门 第一天 学习传送门: 【MATLAB App Designer基础教程Matlab GUI界面设计(全集更新完毕-用户界面设计appdesigner(中文)Matlab Gui教程】 https://www.bilibili.com/video/BV16f4y147x9/?p2&share_sourcecopy_…

音视频解码流程解析

文章目录 1.音视频解码过程2.FFmpeg解音视频流程3.关键函数说明 1.音视频解码过程 2.FFmpeg解音视频流程 3.关键函数说明 avcodec_find_decoder:根据指定AVCodecID查找注册的解码器av_parser_init:初始化AVCodecParserContextavcodec_alloc_context3:创建AVCodecContext上下文…

同行共建,引领潮流,我来说说亚马逊云科技的中国新举措

亚马逊云科技全面阐述生成式AI新机遇,宣布多项举措助力企业加速创新、可持续发展。 【全球云观察 | 热点关注】当前,全球公有云整体规模已经发展到足够大了,来自专业分析机构的数据统计显示,包括了laaS、PaaS、SaaS在内…

gitlab集成kubernetes

gitlab集成kubernetes 1. 管理员通过服务模板添加Kubernetes集群,是生效所有项目 2. 群组中也可以添加Kubernetes集群,优先于管理员添加的全局集群 3. 链接现有集群 4. 配置集群信息 http://178.119.31.180/help/user/project/clusters/add_existing_cl…

uniapp中环状进度条

调用插件&#xff1a; <circle-progress-bar :pro"84/100" :border_back_color"#297DFE" :border_color"#FB8F23">{{84}}%</circle-progress-bar>添加插件引用&#xff1a; <script>import CircleProgressBar from ../../com…