当前位置: 首页 > news >正文

07微服务的事务管理机制

一句话导读

        在单体应用程序中,事务通常是在单个数据库或单个操作系统中管理的,而在微服务架构中,事务需要跨越多个服务和数据库,这就使得事务管理变得更加复杂和困难。

目录

一句话导读

一、微服务事务管理的定义和意义

二、微服务事务管理的策略

        1.使用Saga模式:

        2.两阶段提交(2PC):

        3.异步消息

        4.分布式事务协调器

        5.补偿机制

三、分布式事务CAP原则

        1.一致性(Consistency)

        2.可用性(Availability)

        3.分区容忍性(Partition Tolerance)

四、微服务事务管理的挑战

        1.原子性

        2.一致性

        3.隔离性

        4.持久性


一、微服务事务管理的定义和意义

  • 定义:微服务事务管理是指在微服务架构中,对跨越多个服务的事务进行管理和协调。一个事务通常包含一系列的服务调用,这些服务调用要么全部成功,要么全部失败。微服务事务管理的主要目标是确保跨多个服务的业务操作的一致性和可靠性。

图(1)

        上图是一个经典的微服务事务管理示意图,当客户下单时,订单服务聚合层接收到下单请求,将操作拆分成不同请求分发到不同服务中,如在订单服务中创建订单,在支付服务中创建支付订单,在库存服务中扣减库存,这些操作要么都成功要么都失败,这就是微服务的事务管理的基本特性。

  • 意义:在一个分布式系统中,事务管理变得尤为重要。由于不同的服务可能由不同的团队开发和管理,因此必须有一种机制来确保跨多个服务操作的一致性和完整性。微服务事务管理提供了这样的机制,使得开发者能够更加专注于业务逻辑的实现,而不用担心分布式事务的问题。

二、微服务事务管理的策略

        目前,关于微服务事务管理的研究已经取得了许多成果。例如,二阶段提交协议(2PC)、补偿事务(Compensating Transactions)、Saga模式等都是解决分布式事务问题的常用方法。

        1.使用Saga模式:

        Saga是一种将大型事务拆分为一系列较小事务的模式。每个微服务都有自己的Saga,处理自己的事务,如果某个步骤失败,可以触发回滚或者补偿操作。

        Saga 模式的核心思想是,将长时间跨多个服务的大型事务拆分为多个小的本地事务,这些本地事务可以在系统中不同的节点上并行执行。每个本地事务都有一个对应的补偿操作,用于撤销该事务的影响。这种设计使得如果某个事务失败,系统可以通过执行补偿操作来回滚之前的操作,以保持数据的一致性。

图(2)

相对应图(1),图(2)多了一个失败回滚接口

        2.两阶段提交(2PC):

        2PC是一种协调多个事务参与者以确保所有参与者都同意提交或回滚的协议。尽管2PC具有一定的复杂性和性能开销,但在某些情况下仍然是一个有效的解决方案。"2" 表示协议有两个阶段,而 "PC" 表示这两个阶段的操作

图(3)

  • Coordinator(协调者):负责协调整个分布式事务的执行。协调者向所有参与者发送请求,以确定是否可以提交事务。
  • Participant(参与者):分布式系统中的各个节点,参与者执行实际的事务操作。参与者接收到协调者的请求,根据自身的状态判断是否可以提交事务。
  • CanCommit(阶段1:准备阶段Prepare):协调者向所有参与者发送请求,询问是否可以提交事务。参与者根据自身状态,判断是否可以执行事务。
  • DoCommit(阶段2:提交阶段Commit):如果所有参与者都同意提交事务,协调者发送提交请求,参与者正式提交事务。

        3.异步消息

        使用消息队列来实现异步通信,将事务操作转化为消息,由接收方处理。这种方式可以减少分布式事务的复杂性。

        4.分布式事务协调器

        一些分布式事务协调器,如TCC(Try-Confirm-Cancel)和XA协议,可以用来处理分布式事务的协调和管理。

        5.补偿机制

        在某些情况下,事务失败后可以通过执行逆向操作来进行补偿,确保数据的一致性

三、分布式事务CAP原则

        CAP定理指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)这三个属性无法同时完全满足,最多只能同时满足其中的两个。

图(4) 

        1.一致性(Consistency)

        所有节点在同一时间具有相同的数据副本,即每个读操作都能够读到最近一次的写操作。

        2.可用性(Availability)

        每个非故障节点在合理的时间内都能够响应请求,即系统随时可用并能够处理请求。

        3.分区容忍性(Partition Tolerance)

        即使网络分区(节点之间的通信故障)发生,系统仍然能够继续运行,保持一致性和可用性。

四、微服务事务管理的挑战

        我们知道,在单体应用中事务的管理是基于关系型数据库的事务机制实现的,因为单体应用只使用了一个数据库,每个操作都是在该数据库中进行。但是微服务却不一样,每个服务有自己的数据库,跨服务、跨数据库的事务管理就非常复杂了。单体应用的事务特性ACID对于微服务来说就是很大的挑战

        1.原子性

事务被视为一个不可分割的最小单位,多个操作组合形成一个事务,这些操作要么全部执行,要么全部不执行。

        2.一致性

在分布式环境中,要确保多个微服务的操作要么全部成功,要么全部回滚,以维护数据的一致性。实现原子性和一致性需要精心的设计和实现。

        3.隔离性

分布式事务需要处理并发操作,确保不同事务之间的操作不会相互干扰。保持隔离性是必要的,但也可能影响性能。

        4.持久性

在微服务架构中,不同微服务的数据可能存储在不同的数据库中。确保分布式事务在各种故障情况下仍能保持持久性是一个挑战。

除了以上ACID挑战外还有如下:

  • 超时和重试:由于网络延迟和故障,分布式事务可能会失败。需要实现超时和重试机制,以确保事务能够在一定时间内完成。
  • 分布式锁:在分布式系统中,锁是一种常用的同步机制。然而,如何实现一个可靠的分布式锁是一个挑战。
  • 性能问题:由于微服务事务涉及到多个服务的交互,因此可能会产生性能问题。如何优化微服务事务的性能也是一个重要的挑战
  • 事务的回滚:当一个事务涉及到多个服务时,如果其中一个服务发生故障,如何回滚其他已经成功执行的服务也是一个挑战。
  • 通信失败:由于微服务之间采用分布式通信机制,因此可能会发生通信失败的情况,导致事务无法正常进行。

相关文章:

07微服务的事务管理机制

一句话导读 在单体应用程序中,事务通常是在单个数据库或单个操作系统中管理的,而在微服务架构中,事务需要跨越多个服务和数据库,这就使得事务管理变得更加复杂和困难。 目录 一句话导读 一、微服务事务管理的定义和意义 二、微…...

CS5523规格书|MIPI转EDP方案设计|替代LT8911芯片电路原理|ASL集睿致远CS替代龙讯

ASL芯片(集睿致远) CS5523是一款MIPI DSI输入,DP/e DP输出转换芯片,可pin to pin替代LT8911龙讯芯片。 MIPI DSI 最多支持 4 个通道,每个通道的最大运行速度为 1.5Gps。对于DP 1.2输出,它支持1.62Gbps和2.…...

【制作npm包5】npm包制作完整教程,我的第一个npm包

制作npm包目录 本文是系列文章, 作者一个橙子pro,本系列文章大纲如下。转载或者商业修改必须注明文章出处 一、申请npm账号、个人包和组织包区别 二、了解 package.json 相关配置 三、 了解 tsconfig.json 相关配置 四、 api-extractor 学习 五、npm包…...

QT:定时器事件

定时器第一种办法: 1.利用事件timerEvent,在帮助文档中找到该字段:[override virtual protected] void QTimer::timerEvent(QTimerEvent *e) 重写该虚函数 //重写定时器事件void timerEvent(QTimerEvent *e);2.启动定时器startTimer(1000); …...

GitHub Actions自动化部署+定时百度链接推送

前言 最近用VuePress搭建了一个静态网站,由于是纯静态的东西,每次修改完文章都要重新打包上传很是麻烦。虽然vuepress-theme-vdoing主题作者提供了GitHub Actions自动化部署的教程文章,但是过于简陋且是19年发布的。。 1. 创建一个GitHub仓…...

PHP学习心得:如何编写可维护的代码

PHP学习心得:如何编写可维护的代码 引言: 在现代的软件开发中,编写可维护的代码是非常重要的。无论是个人项目还是团队项目,可维护的代码可以提高开发效率,减少维护成本,确保代码的质量和可扩展性。本文将…...

使用vscode进行远程调试

官方调试手册:vscode官方调试手册 1.安装python扩展 如果是远程连接的话,一定要在ssh上启用扩展。不然创建基于python的配置文件时就会提示,无python扩展。 2.新建配置文件,并修改参数 点击左侧第四个按钮,运行与调试…...

LinuxC编程——进程

目录 一、概念1.1 程序1.2 进程 二、特点⭐⭐⭐三、进程段四、进程分类五、进程状态六、进程状态转换图七、函数接口1. 创建子进程2. 回收进程资源3. 退出进程4. 获取进程号 八、守护进程 一、概念 进程和程序是密不可分的两组概念,相对比,便于理解。 1.…...

深入理解设计模式-结构型之适配器

适配器模式(Adapter Pattern): 适配器模式用于将一个类的接口转换成另一个类的接口,以使两者能够一起工作。适配器模式通常用于处理已经存在的类,让它们能够与其他类协同工作,而不需要修改原始类的代码。&…...

桥梁结构健康监测系统,智能预警降低桥梁安全隐患

桥梁通常位于现代综合交通网络中的咽喉部位,对区域经济发展起着重要的推进作用,然而在为社会经济发展做出巨大贡献的同时,它们不可避免地会在荷载作用、环境侵蚀和自然灾害等影响下出现材料腐蚀劣化、结构损伤开裂、性能退化和功能失效等损伤…...

夏威夷等全球多地深陷「末日狂烧」,关键时刻 AI 监测能否跑赢野火?

内容一览:当地时间 8 月 8 日,美国夏威夷州突发野火,当地居民和游客不得不跳入太平洋中躲避火势。截至 8 月 17 日,这场野火已经造成110 人死亡,超过 1000人失踪。与此同时,美国、加拿大、法国等地也正遭遇…...

解决多模块内核心模块有接口打包成jar后被依赖并调用遇到的问题(springcloud集成ruoyi.quartz)

项目准备开发个新功能,刚好很喜欢ruoyi写的任务调度,因此想到了集成ruoyi.quartz模块 ,遇到了很多问题: 首先因为ruoyi.quartz模块依赖了ruoyi.common模块,因此第一步我需要把common模块一部分依赖项复制到了quartz模块内&#xf…...

【kubernetes系列】Kubernetes之Kubelet运行机制和状态更新机制

Kubelet运行机制 Kubelet是Kubernetes中的一个重要组件,在每个 Node 节点上都会启动 kubelet 服务。 该服务主要用于处理 Master 节点下发到本节点的任务,管理 Pod及Pod 中的容器。每个kubelet 进程会在 API Server 上注册节点自身信息,定期…...

(学习笔记-进程管理)怎么避免死锁?

死锁的概念 在多线程编程中,我们为了防止多线程竞争共享资源而导致数据错乱,都会在操作共享资源之前加上互斥锁,只有成功获得到锁的线程,才能操作共享资源,获取不到锁的线程就只能等待,直到锁被释放。 那…...

【golang】链表(List)

List实现了一个双向链表,而Element则代表了链表中元素的结构。 可以把自己生成的Element类型值传给链表吗? 首先来看List的四种方法。 MoveBefore方法和MoveAfter方法,它们分别用于把给定的元素移动到另一个元素的前面和后面。 MoveToFro…...

android平台的语音聊天助手源码

目录 1 android平台的语音聊天助手源码 1.1 //js处理工具类 1.1.1 openImage 1.2 LoadWebDetails android平台的语音聊天助手源码package com.shrimp.xiaoweirobot.net; import java.util.ArrayList;...

Python读取Word统计词频输出到Excel

1.安装依赖的包 "# 读取docx\n", "!pip install python-docx\n", "!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx\n", "# 中英文分词\n", "!pip install jieba\n", "!pi…...

windows docker mysql8.0 挂载配置文件不生效的问题

原因 mysql 8.0 遇到sql_modeonly_full_group_by的问题,于是就自定义my.cnf 去掉only_full_group_by,修改my.cnf 文件后,进行映射启动 docker run 命令 docker run -p 3306:3306 --privilegedtrue --restartalways -d --name axsc-mysql -…...

openGauss学习笔记-42 openGauss 高级数据管理-触发器

文章目录 openGauss学习笔记-42 openGauss 高级数据管理-触发器42.1 语法格式42.2 参数说明42.3 示例 openGauss学习笔记-42 openGauss 高级数据管理-触发器 触发器会在指定的数据库事件发生时自动执行函数。 42.1 语法格式 创建触发器 CREATE TRIGGER trigger_name { BEFORE…...

Leetcode33 搜索旋转排序数组

题解: /*** 旋转排序数组可分为N1 N2两个部分,如:[4,5,6,7,1,2,3],N1为[4,5,6,7],N2为[1,2,3]** 必然满足以下两个条件:* 1. N1和N2都是分别递增的;* 2. N1中的所有元素大于N2中的所有元素;** …...

PyTorch 2.8镜像实际效果:torch.compile+FlashAttention-2双优化下的吞吐量提升对比

PyTorch 2.8镜像实际效果:torch.compileFlashAttention-2双优化下的吞吐量提升对比 1. 镜像环境与技术亮点 PyTorch 2.8深度学习镜像为开发者提供了一个开箱即用的高性能计算环境。基于RTX 4090D 24GB显卡和CUDA 12.4的深度优化组合,这个镜像特别适合需…...

Qwen3.5-2B入门指南:WebUI中Clear Image按钮对多轮图文对话的影响

Qwen3.5-2B入门指南:WebUI中Clear Image按钮对多轮图文对话的影响 1. 认识Qwen3.5-2B轻量化多模态模型 Qwen3.5-2B是Qwen3.5系列中的轻量级版本,仅有20亿参数规模。这个模型特别适合在资源有限的设备上运行,比如个人电脑、边缘计算设备等。…...

SENet实战:如何在PyTorch中实现Squeeze-and-Excitation模块(附完整代码)

PyTorch实战:手把手实现SENet中的SE模块 在计算机视觉领域,注意力机制已经成为提升模型性能的重要工具。今天我们将深入探讨如何在PyTorch中实现Squeeze-and-Excitation(SE)模块——这个让ResNet-50在ImageNet上表现接近ResNet-10…...

忍者像素绘卷部署案例:高校数字媒体实验室低成本构建像素艺术教学平台

忍者像素绘卷部署案例:高校数字媒体实验室低成本构建像素艺术教学平台 1. 项目背景与需求分析 数字媒体艺术教育正面临新的挑战与机遇。某高校数字媒体实验室在2023年教学评估中发现: 传统像素艺术教学依赖商业软件,授权费用高昂学生创作受…...

告别SpeedGoat:低成本搭建Simulink Real-Time硬件在环(HIL)平台,基于PC+松下伺服实战

低成本搭建Simulink实时控制平台:基于PC与松下伺服的硬件在环方案 在工业自动化与运动控制领域,实时硬件在环(HIL)测试是验证算法有效性的关键环节。传统方案如SpeedGoat等专用设备虽性能稳定,但动辄数十万的成本让许多…...

cv2.findContours()错误的解决办法ValueError: not enough values to unpack (expected 3, got 2)

方法一:直接去掉一个返回值就即可。 方法二:把OpenCV 安装3.X的版本 具体原因 2、解析差异: OpenCV2和OpenCV4中: findContours这个轮廓提取函数会返回两个值:①轮廓的点集(contours)②各层轮廓的索引(hierarchy) 返回…...

抖音视频批量下载高效解决方案实战指南

抖音视频批量下载高效解决方案实战指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量下载工具&…...

[Python3高阶编程] - 异步编程深度学习指南二(补充1): 什么是 Barrier 原语 【异步!!!】

asyncio.Barrier 是 Python 3.11(2022 年 10 月)新增的高级同步原语,用于解决特定并发协作场景。一、Barrier 产生的背景:为什么需要它?核心问题:“多协程阶段对齐”在并发编程中,经常遇到这样的…...

汇川小型机 H5U编写程序 设备采用回转hu小型机编写程序不含的硬件配置有ECT的总线

汇川小型机 H5U编写程序 设备采用回转hu小型机编写程序不含的硬件配置有ECT的总线,包括汇川660系列伺服驱动器以及Io模块。 设备程序分段明确采用梯形图编写更加方便,直观,易懂各个伺服轴密切配合,实现收放卷pid调节,以…...

MCP只是过渡,CLI才是AI的原生界面——从飞书、钉钉集体CLI化说起

文章目录一、从"养龙虾"说起:一场返祖式的革命二、MCP:伟大的"USB-C",但依然是个翻译器三、CLI:AI的母语,不需要翻译四、MCPCLI:过渡方案与终极形态的共生五、对开发者的冷思考&#x…...