分布式事务(五)——基于本地消息和可靠消息的解决方案

系列目录:

  • 《分布式事务(一)—— 事务的基本概念》

  • 《分布式事务(二)—— CAP和Base理论》

  • 《分布式事务(三)—— 两阶段提交解决方案(2PC)》

  • 《分布式事务(四)——TCC补偿模式解决方案》

一、常见分布式事务解决方案

  • 两阶段提交(2PC,Two-phase Commit)
  • TCC补偿模式
  • 基于本地消息表实现最终一致性
  • 基于可靠消息最终一致方案
  • 最大努力通知

一、基于本地消息表实现最终一致

  基于本地消息表实现数据一致性的方案最初是由eBay提出的,此方案的核心是通过本地事务保证数据业务操作和消息的一致性,然后通过定势任务将消息发送到消息中间件,待确认消息发送给消费方成功再将定时任务的消息删除。这种方式的主要逻辑就是通过定势任务一致发送消息,直到成功为止。其优缺点也就一目了然了,最大的问题也就是在定时任务上面。所以其适用于一些必须通知到位的场景。如果在有可能不需要通知到位(比如发短信)这种,有可能造成定时任务的浪费和性能瓶颈。

下面以注册懂积分为例来说明这种方式的用法:
下例公有两个微服务,用户服务和积分服务,用户服务负责添加用户,积分服务负责增加积分。
在这里插入图片描述
交互流程如下:

  • 1、用户注册
    用户服务在本地事务新增用户和增加积分消息日志。
  • 2、定时任务扫描日志
    经过第一步消息已经写到消息日志表中,可以地洞独立的线程,定时对消息日志表中的消息进行扫描并发送至中间件,在消息中间件反馈发送成功后删除该日志,否则等待定势任务下一周期重试。
  • 3、消费消息
    如何保证消费者一定能消费到消息呢?
    可以使用MQ的ack(即消息确认)机制,消费者监听MQ,如果消费者接受到消息并且业务处理完成后向MQ发送ack,此时说明消费者正常消费消息完成,MQ将不再向消费者推送消息,否则会不断重试向消费者发送消息。

由于消息会重复投递,积分服务的增加积分功能需要实现幂等性

总结:
上述的方法是一种非常经典的实现,基本避免了分布式事务,实现了“最终一致性”。但是,关系型数据库的吞吐量和性能方面存在瓶颈。频繁的读写消息会给数据库造成压力,在真正的高并发场景下,该方案也会有瓶颈和限制
在这里插入图片描述

二、基于可靠消息最终一致方案

  在上面基于本地消息的方案中,是由一个定时任务查询需要发送的消息,同时接受执行完成的消息,来实现数据的最终一致的,其主要的问题是在定时任务上,如果存在一个可靠的MQ,能够解决消息的发送端和本地事务的原子性,这样就不需要利用定时任务来重复的发送消息了。目前能满足这个功能的MQ常用的就是RocketMQ
  RocketMQ是一个来自阿里巴巴的分布式消息中间件,于2012年开源,并在2017年正式成为Apache顶级项目。据了解,包括阿里云上的消息产品以及收购的子公司在内,阿里集团的消息产品全线都运行在RocketMQ上,并且最近几年的双十一大促中,RocketMQ都有十分优秀的表现。Apache RocketMQ 4.3以后得版本正式支持事务消息,为分布式事务实现提供便利性支持。
  RocketMQ事务消息设计则主要是为了解决Producer端的消息发送与本地事务执行的原子性问题。RocketMQ的设计中broker与producer端的双向通信能力,使的broker天生可以作为一个事务协调者存在;而RocketMQ本身提供的存储机制为事务消息提供了持久化能力;RocketMQ的高可用机制以及可靠的消息设计为事务消息在系统议程发生时依然能够保证达成事务的最终一致性。
  在RocketMQ4.3后实现了完整的事务消息,其实是对本地消息表的一个封装,将本地消息表移动到了MQ的内部,解决Producer端的消息发送与本地事务执行的原子性问题。
在这里插入图片描述
为方便我们理解,我们以注册送积分的例子来描述整个过程。
Producer即MQ的发送方,本例中是用户服务,负责新增用户,MQ订阅方是消息消费方,本例中是积分服务,负责新增积分。其流程如下:

  • 1、Producer发送事务消息
    Producer发送事务消息到MQ Server,MQ Server将消息状态标记为Prepared(预览状态),注意此时这条消息的消费方(MQ订阅方)是无法消费到的。
  • 2、MQ Server回应消息发送成功
    MQ Server接收到Producer发送给的消息则回应发送成功表示MQ已经接收到消息。
  • 3、Producer执行本地事务
    Producer端执行业务代码逻辑,通过本地数据库控制事务,本例中,就是添加用户操作。
  • 4、消息投递
    若Producer本地事务执行成功则自动向MQ Server发送commit消息,MQ Server接收到commit消息后将“增加积分消息”状态标记为可消费,此时MQ订阅方即正常消费消息。
    若Producer本地事务执行失败则自动向MQ Server发送rollback消息,MQ Server接收到rollback消息后删除“增加积分消息”
    MQ订阅方消费消息,消费成功则向MQ回应ack,否则经重复接受消息。这里ack默认自动回应,即程序执行正常则自动回应ack。
  • 5、事务回查
    如果执行Producer端本地事务的过程中,执行端挂掉,或者超时,MQ Server将会不停地询问同组的其他Producer来获取事务执行状态,这个过程就叫做事务回查。MQ Server 会根据事务回查结果来决定是否投递消息。

以上主干流程已由RocketMQ实现,对于用户来说,用户需要分别实现本地事务执行以及本地事务回查方法,因此只需要关注本地事务的执行状态即可。


后记
  个人总结,欢迎转载、评论、批评指正

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安卓滚动视图ScrollView

<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:orientatio…

mybatisplus-多数据源配置

1. 流程 pom文件yml配置多数据源具体服务添加注解DS(“***”) 1.pom文件 <!--mybatis plus 起步依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</vers…

《苍穹外卖》电商实战项目实操笔记系列(P123~P184)【下】

史上最完整的《苍穹外卖》项目实操笔记系列【下篇】&#xff0c;跟视频的每一P对应&#xff0c;全系列10万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。 上篇&#xff1a;P1~P65《苍穹外卖》项…

JavaWeb前端——HTML/CSS

HTML/CSS概述 HTML&#xff1a;学习标签&#xff0c;CSS&#xff1a;学习样式 HTML 1. 不区分大小写。 2. 属性可以使用单引号/双引号 3. 在记事本/编辑器中编写html语言&#xff0c;通过浏览器解析渲染语言 4. 语法结构松散&#xff08;编写时要尽量严谨&#xff09; VSc…

Vulnhub-RIPPER: 1渗透

文章目录 一、前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、rips的使用三、获取密码文件四、日志审查五、提权 一、前言 由于在做靶机的时候&#xff0c;涉及到的渗透思路是非常的广泛&#xff0c;所以在写文章的时候都是挑重点来写&#xff0c;尽量的不饶…

Ant Design Mini - 支付宝小程序官方推出的免费开源 UI 组件库,新增支持微信小程序,实用性大大增加

支付宝小程序官方的 UI 组件库开始支持运行在微信小程序上了&#xff0c;如果要开发这两家小程序平台&#xff0c;这套组件很合适。 Ant Design Mini 也简称 antd-mini &#xff0c;是一套运行在支付宝小程序的 UI 组件库&#xff0c;UI 设计遵循 Ant Design 规范&#xff0c;…

前端Vue select 下拉框详解以及监听事件

目录 简介 使用详解 演示示例 :key"option.value" :value"option.value" 区别 监听事件 简介 在 Vue 中&#xff0c;下拉框通常通过 <select> 元素与一系列的 <option> 元素来创建。Vue 的数据绑定和指令&#xff08;如 v-model 和 v-for…

color - 让你的输出带点颜色

color color 是一个可以让你输出带颜色文本的库。 安装 go get github.com/fatih/color示例 输出到控制台 // 这会直接输出到控制台 color.Cyan("Prints text in cyan.")// 每个调用末尾会自动加上换行 color.Blue("Prints %s in blue.", "text&…

composer常用命令

查看全局配置信息 composer config -gl 设置镜全局像地址 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 去掉-g&#xff0c;即表示只有当前项目使用该镜像 批量安装composer项目依赖 composer install 执行该命令后&#xff0c;会读取当…

1295584-83-6,NOTA 马来酰亚胺,可通过与铁离子结合增强MRI信号

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;1295584-83-6&#xff0c;NOTA Maleimide&#xff0c;NOTA Mal&#xff0c;NOTA马来酰亚胺 一、基本信息 产品简介&#xff1a;NOTA Maleimide has good water solubility and stability, which enables it to main…

不移其志,踏浪前行 | 北京智和信通召开2023年度工作总结大会

岁聿云暮&#xff0c;新元肇启&#xff0c;2024年1月24日&#xff0c;北京智和信通技术有限公司&#xff08;以下简称“北京智和信通”&#xff09;召开2023年度年终总结大会。会上&#xff0c;各部门负责人全面分析公司业务发展态势&#xff0c;各部门员工依次汇报主要工作情况…

Javaweb实现的学生宿舍管理系统

Javaweb实现的学生宿舍管理系统 文章目录 Javaweb实现的学生宿舍管理系统系统介绍技术选型成果展示源码获取账号地址及其他说明 系统介绍 Javaweb实现的学生宿舍管理系统采用jspservlet技术实现了如下功能模块&#xff0c;分别是宿舍管理员管理、学生管理、宿舍楼管理、缺勤记…

Solidworks 与 MATLAB 联合仿真

本文主要讲解了“MATLAB与SolidWorks的联合仿真怎么实现”&#xff0c;文中的讲解内容简单清晰&#xff0c;易于学习与理解&#xff0c;下面请大家跟着小编的思路慢慢深入&#xff0c;一起来研究和学习“MATLAB与SolidWorks的联合仿真怎么实现”吧&#xff01; 下载插件。 1、…

基于 LLM+LlamaIndex+NebulaGraph,构建大模型知识图谱的检索(RAG)方法

最近&#xff0c;围绕着利用 LLM&#xff08;Language Model&#xff09;和知识图谱&#xff08;KG&#xff0c;Knowledge Graphs&#xff09;构建RAG&#xff08;Retrieval Augmented Generation&#xff09;流程引起了很多关注。 在本文中&#xff0c;让我们通过利用 LlamaI…

leetcode189.轮转数组|超简单易于理解方法

题目 https://leetcode.cn/problems/rotate-array/description/https://leetcode.cn/problems/rotate-array/description/ 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输…

【模型微调】| 各类微调模型总结 P-Tuning,Prefix,P-tuning v2,LoRA

文章目录 1 微调背景1.1 Full fine-tuning 全参数微调&#xff08;FFT&#xff09;1.2 parameter-Efficient-fine-tuning 部分参数微调&#xff08;PEFT&#xff09; 2 提示词调整训练法2.1 P-Tuning2.2 Prefix2.3 P-Tuning v2 3 结构调整训练法3.1 Adapter tuning3.2 LoRA 微调…

永久删除 Elasticsearch 中的主节点

Elasticsearch 是一个开源分布式搜索和分析引擎&#xff0c;用于各种任务&#xff0c;例如全文搜索、日志分析和实时数据分析。 Elasticsearch 集群由一个或多个节点组成&#xff0c;每个节点可以具有多种角色&#xff0c;包括主节点&#xff08;master node&#xff09;、数据…

15. 三数之和(力扣LeetCode)

文章目录 15. 三数之和题目描述双指针去重逻辑的思考a的去重b与c的去重 15. 三数之和 题目描述 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 …

C# 使用 MailKit 接收邮件(附demo)

C# 使用 MailKit 接收邮件&#xff08;附demo&#xff09; 介绍安装包&#xff08;依赖&#xff09;简单代码获取附件核心代码完整代码 介绍 MailKit 是一个开源的 C# 邮件处理库&#xff0c;用于在应用程序中发送和接收电子邮件。它提供了一个强大且易于使用的 API&#xff…

2024最新版TypeScript安装使用指南

2024最新版TypeScript安装使用指南 Installation and Development Guide to the Latest TypeScript in 2024 By JacksonML 1. 什么是TypeScript? TypeScript is JavaScript with syntax for types. – typescriptlang.org TypeScript 是 JavaScript 的一个超集&#xff0c;…