07微服务的事务管理机制

news2024/12/25 15:15:49

一句话导读

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

目录

一句话导读

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

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

        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.coloradmin.cn/o/887147.html

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

相关文章

ORCA优化器浅析——CDXLScalar Base class for representing scalar DXL operators

CDXLScalar类作为Base class for representing scalar DXL operators,该类只是定义一些接口,其中实现了GetDXLOperatorType函数,其返回EdxloptypeScalar,代表scalar DXL operators。 class CDXLScalar : public CDXLOperator{ pr…

迅捷视频工具箱:多功能音视频处理软件

这是一款以视频剪辑、视频转换、屏幕录像等特色功能为主,同时附带有视频压缩、视频分割、视频合并等常用视频处理功能为主的视频编辑软件。该软件操作简单易用,即使没有视频处理经验的用户也可以轻松上手。将视频添加到工具箱对应功能后,简单…

01- vdom 和模板编译源码

组件渲染的过程 template --> ast --> render --> vDom --> 真实的Dom --> 页面 Runtime-Compiler和Runtime-Only的区别 - 简书 编译步骤 模板编译是Vue中比较核心的一部分。关于 Vue 编译原理这块的整体逻辑主要分三个部分,也可以说是分三步&am…

sklearn机器学习库(二)sklearn中的随机森林

sklearn机器学习库(二)sklearn中的随机森林 集成算法会考虑多个评估器的建模结果,汇总之后得到一个综合的结果,以此来获取比单个模型更好的回归或分类表现。 多个模型集成成为的模型叫做集成评估器(ensemble estimator)&#xf…

RabbitMq-1基础概念

RabbitMq-----分布式中的一种通信手段 1. MQ的基本概念(message queue,消息队列) mq:消息队列,存储消息的中间件 分布式系统通信的两种方式:直接远程调用,借助第三方完成间接通信 消息的发送方是生产者&#xff0c…

爬虫逆向实战(九)--猿人学第十三题

一、数据接口分析 主页地址:猿人学第十三题 1、抓包 通过抓包可以发现数据接口是api/match/13 2、判断是否有加密参数 请求参数是否加密? 无请求头是否加密? 无响应是否加密? 无cookie是否加密? 在“cookie”模块…

python数据分析需要学哪些,python数据分析要学多久

大家好,小编为大家解答python数据分析应该学什么软件的问题。很多人还不知道python数据分析需要什么基础,现在让我们一起来看看吧! 根据调查结果,十大最常用的数据工具中有八个来自或利用Python。Python广泛应用于所有数据科学领域…

STM32 FLASH 读写数据

1. 《STM32 中文参考手册》,需要查看芯片数据手册,代码起始地址一般都是0x8000 0000,这是存放整个项目代码的起始地址 2. 编译信息查看代码大小,修改代码后第一次编译后会有这个提示信息 2.1 修改代码后编译,会有提示…

物联网在制造业中的应用

制造业目前正在经历第四次工业革命,物联网、人工智能和机器人等技术进步正在推动行业的发展。研究表明,到2024年,全球制造商将在物联网解决方案上投资700亿美元,许多制造商正在实施物联网设备,以利用预测性维护和复杂的…

优化GitHub网站访问慢的问题

方法一、修改host文件解决 大型网站服务器都不会是只有一台服务器,而是多台服务器组成的集群一起对外提供服务。 使用站长工具测速,找一个速度比较快的服务器。 图中可以看到140.82.121.4这个ip比较快, 下面修改hosts: Mac 在 /etc/hosts 中&#x…

.net连接mysql,提示找不到请求的 .Net Framework Data Provider。可能没有安装

开发完成的.net程序需要连接mysql数据库,在个人电脑上运行没问题,别人运行时提示“提示找不到请求的 .Net Framework Data Provider。可能没有安装”。经过查询,安装Connector/NET 8.1.0,下载地址如下所示: https://d…

Mac OS minicom 无法设置921600问题

MacOS minicom 无法设置921600问题 介绍过程解决方案参考资料 介绍 minicom是Mac上一款非常好用的串口工具。本文假设你已经安装minicom,并且知道minicom的一般配置和使用方法。这是“MacOS minicom 无法设置921600”的解决问题记录。它在以下环境中设置成功&#…

【制作npm包1】申请npm账号、认识个人包和组织包

概述 在开发当中经常有一种现象,重复代码写了N多遍,再次写同样的逻辑就再次翻查以前的代码逻辑。效率低下且容易出错,封装一个npm包的价值也不仅仅是给别人用,封装一套属于自己或者本部门的npm包也是相当有必要。 也许经常看到一…

fastadmin 自定义按钮弹窗不是异步xhr提交

遇到一个奇怪的问题 按官方文档要求,js中也重新绑定事件了 但弹窗出来的表单还不是xhr提交,这为什么? 经过我不断测试发现,如上述的方法名不能带有下划线,蛇形大小写,否则一律不生效。 浪费了我一天半时…

小程序CSS button按钮自定义高度之后不居中

问题&#xff1a; 按钮设置高度后不居中 <view><button class"btn1" size"">Save</button> </view> page {font-size: 30rpx; }.btn1 {margin-top: 100rpx;height: 190rpx;background: linear-gradient(90deg, #FF8A06, #FF571…

webSocket 聊天室 node.js 版

全局安装vue脚手架 npm install vue/cli -g 创建 vue3 ts 脚手架 vue create vue3-chatroom 后端代码 src 同级目录下建 server: const express require(express); const app express(); const http require(http); const server http.createServer(app);const io req…

微信小程序:模板使用

目录 模板的优点&#xff1a; 一、静态模板创建 二、静态模板使用 1.*.wxml引入模板 2.模板使用 3.*.wxss引入模板的样式 三、动态模板创建 四、动态模板使用 1.*.wxml引入模板 2.模板使用 3.*.js定义动态数据 五、结果展示 总结 模板的优点&#xff1a; 有利于保持网…

第二章 搜索 No.1BFS之Flood Fill与最短路模型

文章目录 Flood Fill算法1097. 池塘计数1098. 城堡问题1106. 山峰和山谷 最短路模型1076. 迷宫问题188. 武士风度的牛1100. 抓住那头牛 Flood Fill算法 可以在线性时间复杂度内&#xff0c;找到某个点所在的连通块 想象一个矩阵&#xff0c;有洼地和高地&#xff0c;选择一个洼…

经验分享:企业数据仓库建设方案总结!

导读 在企业的数字化转型浪潮中&#xff0c;数据被誉为“新时代的石油”&#xff0c;而数据仓库作为数据管理与分析的核心基础设施&#xff0c;在企业的信息化建设中扮演着重要的角色。本文将深入探讨企业数据仓库建设过程中所遇到的问题以及解决经验&#xff0c;为正在筹备或…

微信程序 自定义遮罩层遮不住底部tabbar解决

一、先上效果 二 方法 1、自定义底部tabbar 实现&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html 官网去抄 简单写下&#xff1a;在代码根目录下添加入口文件 除了js 文件的list 需要调整 其他原封不动 代码&#xf…