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挑战外还有如下:

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

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

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

相关文章

Layui列表表头去掉复选框改为选择

效果&#xff1a; 代码&#xff1a; // 表头复选框去掉改为选择 $(".layui-table th[data-field"0"] .layui-table-cell").html("<span>选择</span>");

做好以下几点,可以让我们延长周末体验感,好好放松!!!

工作以后常常容易感到疲于奔命&#xff0c;让我们找到适合自己方式&#xff0c;来让我们度过一个充实放松的周末! 方向一&#xff1a;分享你周末的时间规划 我们可以把每个月当做一个周期&#xff0c;制定一个简单的计划&#xff0c;如&#xff1a;第一周&#xff0c;锻炼身体…

基于Prometheus监控Kubernetes集群

目录 一、环境准备 1.1、主机初始化配置 1.2、部署docker环境 二、部署kubernetes集群 2.1、组件介绍 2.2、配置阿里云yum源 2.3、安装kubelet kubeadm kubectl 2.4、配置init-config.yaml 2.5、安装master节点 2.6、安装node节点 2.7、安装flannel、cni 2.8、部署测…

低成本无刷高速吹风机单片机方案

高速吹风机的转速一般是普通吹风机的5倍左右。一般来说&#xff0c;吹风机的电机转速一般为2-3万转/分钟&#xff0c;而高速吹风机的电机转速一般为10万转/分钟左右。高转速增加了高风速。一般来说&#xff0c;吹风机的风力只有12-17米/秒&#xff0c;而高速吹风机的风力可以达…

使用Docker搭建MySQL主从复制(一主一从)

Docker安装MySQL docker pull mysql:5.7 docker images mysql安装步骤 1.新建主服务器容器实例3307 docker run -p 3307:3306 --name mysql-master -v /usr/local/docker/mysql5.7/data/mysql-master/logs:/var/log/mysql -v /usr/local/docker/mysql5.7/data/mysql-master/…

cve-2016-7193:wwlib 模块堆数据结构溢出

简介 漏洞编号&#xff1a;cve-2016-7193漏洞类型&#xff1a;堆溢出软件名称&#xff1a;Office模块名称&#xff1a;wwlib历史漏洞&#xff1a;较多影响的版本 攻击利用&#xff1a;APT 攻击利器-Word 漏洞 CVE-2016-7193 原理揭秘 操作环境 系统&#xff1a;Win10 1607软…

【Docker报错】docker拉取镜像时报错:no such host

报错信息 [rootSoft soft]# docker pull mysql Using default tag: latest Error response from daemon: Head "https://registry-1.docker.io/v2/library/mysql/manifests/latest": dial tcp: lookup registry-1.docker.io on 192.168.80.2:53: no such host解决方法…

3D模型格式转换工具如何与Parasolid集成?

概述 HOOPS Exchange包括一个 Parasolid 连接器&#xff0c;它允许 Parasolid 开发人员轻松地将 CAD 数据导入到活动的 Parasolid 会话中。如果源数据基于 Parasolid&#xff08;NX、Solid Edge 或 SolidWorks&#xff09;&#xff0c;则数据将按原样导入。 这意味着您可以假…

主数据管理案例-某政务

1、 背景介绍及难点分析 近年来&#xff0c;我国在大数据发展方面持续发力&#xff0c;取得了明显成效。但也要看到&#xff0c;目前我国大数据发展还存在“孤岛化”“碎片化”等问题&#xff0c;无序参与过度与创新参与不足并存&#xff0c;导致大数据资源配置统筹不&#xff…

【C++】list容器

1.list基本概念 2.list构造函数 #include <iostream> using namespace std;#include<list> //链表list容器构造函数//输出list链表 void printList(const list<int>& L) {for (list<int>::const_iterator it L.begin(); it ! L.end(); it){cout &…

STM32入门学习之定时器PWM输出

1.脉冲宽度调制PWM(Pulse Width Modulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM可以理解为高低电平的占空比&#xff0c;即输出高电平时间与低电平时间的比值。PWM的应用是否广泛&#xff0c;比如在步进电机的控制中&#xff0c;可以通过P…

【MySQL系列】-回表、覆盖索引真的懂吗

【MySQL系列】-回表、覆盖索引真的懂吗 文章目录 【MySQL系列】-回表、覆盖索引真的懂吗一、MYSQL索引结构1.1 索引的概念1.2 索引的特点1.3 索引的优点1.4 索引的缺点 二、B-Tree与BTree2.1 B-Tree2.2 BTree2.3 B-Tree 与BTree树的区别2.4 那么为什么InnoDB的主键最好要搞成有…

【软件测试】接口测试工具APIpost

说实话&#xff0c;了解APIpost是因为&#xff0c;我的所有接口相关的文章下&#xff0c;都有该APIpost水军的评论&#xff0c;无非就是APIpost是中文版的postman&#xff0c;有多么多么好用&#xff0c;虽然咱也还不是什么啥网红&#xff0c;但是不知会一声就乱在评论区打广告…

【力扣每日一题】2023.8.14 合并二叉树

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们合并两棵二叉树&#xff0c;合并的方式就是把对应位置的节点的值相加&#xff0c;最后把合并后的二叉树的根节点返回出去。 这类二…

一文看尽R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD详解

一文看尽R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD详解 以下六篇文章总结详细&#xff1a; 1. 一文读懂目标检测&#xff1a;R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD 2. 【深度学习】R-CNN 论文解读及个人理解 3、R-CNN论文详解 4、一文读懂Faster RCNN 5、学一百遍都…

JAVA基础知识(六)——异常处理

异常 一、异常概述与异常体系结构二、常见异常三、异常处理机制一&#xff1a;try-catch-finally四、异常处理机制二&#xff1a;throws五、手动抛出异常&#xff1a;throw六、用户自定义异常类七、开发中如何选择使用try-catch-finally还是使用throws八、如何看待代码中的编译…

goland插件推荐Rider UI Theme Pack

推荐一个goland配色插件Rider UI Theme Pack&#xff0c;里面自带visual assist配色&#xff0c;配色截图如下&#xff1a; 直接在plugins里面进行搜索或者在插件home page下载后进行安装&#xff0c; 然后按照下图进行设置即可。 此插件还适用于Jetbrains旗下的Clion和Pycharm…

WX1860- ngbe-1.2.5 xdp程序在路由模式下,使用iperf工具测试数据包不转发,用jmeter可以

本地验证时重定向iperf包有出现calltrace错误&#xff0c;经推断&#xff0c;系统PAGE_SIZE<8k时可能出现&#xff08;getconf PAGE_SIZE指令可查看&#xff09;&#xff0c;按下图将ngbe_main.c的2350行ngbe_rx_bufsz改为ngbe_rx_pg_size可修复。其次&#xff0c;需要将加载…

Linux多线程【初识线程】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、什么是线程&#xff1f;1.1、基本概念1.2、线程理解1.3、进程与线程的关系…

分布式事务与解决方案

一、什么是分布式事务 首先我们知道本地事务是指事务方法中的操作只依赖本地数据库&#xff0c;可保证事务的ACID特性。而在分布式系统中&#xff0c;一个应用系统被拆分为多个可独立部署的微服务&#xff0c;在一个微服务的事务方法中&#xff0c;除了依赖本地数据库外&#…