在微服务架构中的数据一致性

当从传统的单体应用架构转移到微服务架构时,特别是涉及数据一致性时,数据一致性是微服务架构中最困难的部分。传统的单体应用中,一个共享的关系型数据库负责处理数据一致性。在微服务架构中,如果使用“每个服务一个数据库”的模式,那么每个微服务都有自己的数据存储。因此,数据库在应用程序之间是分布式的。如果每个应用程序使用不同的技术来管理它们的数据,比如非关系型数据库,这种分布式架构虽然在数据管理方面有许多好处,比如可伸缩性、高可用性、灵活性等,但在数据管理方面也存在一些关键问题,比如事务管理、数据一致性/完整性等方面。

bb782f34558716146e9febef4e6adde2.png
1*hJ-Mu2gk7w5h8D7qu90Rvw.png

问题:分布式系统中的数据一致性

对于单体应用程序,通过ACID事务,一个共享的关系型数据库处理并保证数据的一致性。ACID 是一个缩写,具体含义如下:

A 原子性:事务的所有步骤要么全部成功,要么全部失败,没有部分状态,全有或全无。•C 一致性:事务结束时数据库中的所有数据都是一致的。•I 隔离性:同一时间只有一个事务可以访问数据,其他事务必须等待当前事务完成。•D 持久性:数据在事务结束时被持久化到数据库中。

为了保持强数据一致性,关系型数据库管理系统支持ACID特性。

70205cc696036322df964c5352bcb138.png

1*AKnWPWPT56Cb7JSSdpLFaA.png

但在微服务架构中,每个微服务都有自己的数据存储,并采用不同的技术。因此,没有中央数据库,也没有单一的工作单元。业务逻辑被跨越到多个本地事务中。这意味着你不能在微服务架构中的数据库之间使用单一的事务工作单元。但你仍然需要在你的应用程序中使用ACID特性。

06c470c0cc6f68e8c000c1f9d1b05ce0.png

1*ZAFdGYOaZQj62XyOfEjiFw.png

让我们用一个简单的样例场景来解释。在一个订单管理系统中,可能存在库存管理、支付和订单管理等服务。假设这些服务都按照微服务架构设计,并应用了“每个服务一个数据库”的模式。为了完成订单流程,订单服务首先调用库存管理服务进行库存控制和预留,订单中的相关产品被预留,以防止卖给其他客户。第二步是支付步骤。支付服务负责支付业务。订单服务调用支付服务,从客户的信用卡中完成支付。由于每个服务都是独立的,对分离的数据库的更新在服务范围内被提交。最后一步是创建订单记录。在这一步中,假设发生了技术错误,订单记录无法创建,订单号无法发送给客户,但已从客户那里收到了付款。这里出现了数据一致性问题。接下来我会在文章的“可能的解决方案”部分讨论在这一点之后可以做些什么。

6a76252e7a78be9f98161dfe354b9701.png

1*4IfsBTbf53mszzc44OWwLw.png

可能的解决方案

首先,没有一种单一的解决方案适用于所有情况。根据具体情况,可以采用不同的解决方案。

解决问题有两种主要方法:

分布式事务最终一致性

分布式事务

在分布式事务中,事务在两个或多个资源上执行(例如数据库、消息队列)。通过分布式事务管理器或协调器,跨多个数据库保证数据的完整性。

分布式事务是一个非常复杂的过程,因为涉及多个资源。

两阶段提交(2PC) 是一种阻塞协议,用于保证在分布式事务中所有事务要么全部成功,要么全部失败。

XA标准 是2PC分布式事务的规范。JTA包括Xtandard API。符合JTA标准的应用服务器支持Xtandard API。但所有资源必须部署到单个JTA平台才能运行2PC。对于微服务架构来说,这不太合适。

分布式事务的优点

•强的数据一致性•支持ACID特性

分布式事务的缺点

•维护起来非常复杂•由于是阻塞过程(不适合高负载场景),高延迟和低吞吐量•事务之间可能出现死锁•事务协调器是一个单点故障

最终一致性

最终一致性是分布式系统中用于实现高可用性

的模型。在一个最终一致性的系统中,允许一段时间的不一致,直到解决分布式数据的问题。

这个模型不适用于跨多个微服务的分布式ACID事务。最终一致性使用BASE数据库模型。

虽然ACID模型提供了一个一致的系统,但BASE模型提供了高可用性。

BASE这个缩写代表:

Basically Available:通过在数据库集群的节点之间复制数据来确保数据的可用性•Soft-state:由于缺乏强一致性,数据可能随时间变化。一致性责任委托给开发人员。•Eventual consistency:BASE不可能立即提供一致性,但最终会提供一致性(在短时间内)。

SAGA 是一种操作最终一致性模型的常见模式。

基于协同的SAGA:在这种情况下,不存在中央协调器。每个服务在其任务完成后产生一个事件,并且每个服务监听事件以采取行动。这种模式需要一个成熟的事件驱动架构。•事件溯源:使用事件存储来存储事件变化状态的方法。事件存储是充当事件数据库的消息代理。通过重新播放来自事件存储的事件来重建状态。•基于协同的SAGA模式在事务中步骤较少时可以很好地工作(例如2到4个步骤)。当事务中的步骤数量增加时,很难跟踪哪些服务监听哪些事件。•基于编排的SAGA:协调器服务(Saga执行编排器,SEG)负责根据业务逻辑对事务进行排序。编排器决定应执行哪些操作。如果某个操作失败,编排器会撤销先前的步骤。这称为补偿操作。补偿是在系统保持一致状态时发生故障时要执行的操作。•当数据已被不同的事务更改时,撤销更改可能已经不可能。•补偿必须是幂等的,因为在重试机制中可能会被调用多次。•必须小心设计补偿。

有一些可用的框架可以实现Saga编排模式,例如Camunda、Apache Camel。

SAGA的优点

•在本地原子事务中执行非阻塞操作•事务之间没有死锁•没有单点故障

SAGA的缺点

•最终的数据一致性•没有读隔离,需要额外的努力(例如,用户可能会看到操作已完成,但在几秒钟后由于补偿事务被取消)•当参与服务数量增加时,调试困难•开发成本增加(需要实际服务开发以及补偿服务开发)•设计复杂

在维护分布式数据存储之间的数据一致性可能非常困难。在设计新应用程序时需要有不同的思维方式。我们可以说,数据一致性的责任从数据库转移到了应用程序级别。

选择哪种解决方案

解决方案取决于使用案例和一致性要求。总的来说,应考虑以下设计考虑因素。

1.尽可能避免在微服务之间使用分布式事务。使用分布式事务会带来更复杂的问题。2.设计你的系统,尽可能不要求分布式一致性。为了实现这一点,识别事务边界;•识别必须在同一工作单元中工作的操作。对于这种类型的操作使用强一致性•识别可以容忍一致性方面的可能延迟的操作。对于这种类型的操作使用最终一致性3.考虑使用事件驱动架构进行异步非阻塞服务调用4.通过补偿和协调过程设计容错系统,以保持系统的一致性5.最终一致性模式需要在设计和开发方面进行思维方式的转变

结论

微服务架构具有诸如高可用性、可伸缩性、自动化、自治团队等很多优点。为了最大程度地发挥微服务架构风格的效率,传统方法需要进行一些改变。数据和一致性管理是需要仔细设计的。

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

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

相关文章

【安卓】安卓xTS之Media模块 学习笔记(1) xTS介绍

1.背景 Media的安卓xTS相关测试和功能修复已经进行了一段时间了。 在此整理总结下xTS工作总结,留待后续查阅整理。 2. xTS介绍 - 什么是xTS 谷歌的xTS是对谷歌发布的CTS/GTS/VTS/STS/BTS/CTS-on-GSI等一系列测试的统称。 因为安卓系统比较庞大,模块多…

Microsoft Office Exce-筛选后的公式批量复制粘贴为值 并且不乱数据

Microsoft Office Exce-利用选择性粘贴将筛选后的公式结果批量转换为值 1、写好【客单价】公式,并下拉填充 (【SKU】、【销售额】、【销售量】这三列都是常量,非公式) 2、复制客单价公式到E列 3、筛选数据, 按 Delet…

Python基础语法之学习运算符

Python基础语法之学习运算符 一、代码二、效果 一、代码 print("1 1 ", 1 1) print("1 - 1 ", 1 - 1) print("1 * 1 ", 1 * 1) print("11 / 5 ", 11 / 5) print("11 // 5 ", 11 // 5) print("9 % 5 ", 9…

【C++ 程序设计入门基础】- 第3节-循环结构01

目录 循环结构 一、for 语句 for 循环案例 输入一个整数n,输出1~n的所有整数。 编译运行,查看输出结果 编译调试 for 循环结构语义分析 二、beak 语句 三、continue 语句 案例1: 案例2: 案例3: 循环…

ubuntu vmware开启3d加速画面异常

在ubuntu上开启vmware,进入全屏就会出现左上角和右下角两个不同的画面,并来回闪,不使用3d加速,一切正常,但是画面模糊。在ubuntu18 20 22上测试,vmware 15 16 17问题依旧。 原因 经过测试,原…

基于SpringBoot的手机官方商城系统

基于SpringBoot的手机官方商城系统 摘要:随着电子商务的发展,网上购物已成为人们普遍的购物方式。与此同时,网上支付也得到了迅速的发展,大有赶超传统支付的趋势。在今天这个信息化程度高、生活节奏快的现代社会,传统…

Java —— 泛型

目录 1. 什么是泛型 2. 泛型背景及其语法规则 3. 泛型类的使用 3.1 语法 3.2 示例 3.3 类型推导(Type Inference) 4. 裸类型(Raw Type) 4.1 说明 5. 泛型如何编译的 5.1 擦除机制 5.2 为什么不能实例化泛型类型数组 6. 泛型的上界 6.1 上界语法产生的背景 6.2 语法 6.3 示例 6.…

代码随想录算法训练营 ---第四十九天

前言: 今天是买卖股票的最佳时机系列,本系列之前在学习贪心思想时做过一些。 第一题: 简介: 本题在读题时我们要注意到几个细节 1.本题股票买卖只有一次。2.我们要在最低点买股票,在最高点卖股票。 我的思路&#…

【攻防世界-misc】hong

1.下载解压文件,是个音频文件,但打不开 2.复制到kali中先拆分看音频里面有隐含文件没有 用到的命令是:foremost 桌面/hong.mp3 点击桌面上的主文件夹 点击“output”文件夹, 点击文件中的jpg文件夹,有两张图片&#…

uniapp使用vue3和ts开发小程序获取用户城市定位

这个组件的功能:可以重新定位获取到用户的具体位置,这个是通过getLocation这个api和高德地图的api获取到的,getLocation这个api需要在微信公众平台后台>开发管理> 接口管理里面申请才能使用的,不然无法使用哦,这…

大数据存储技术期中考点梳理

1.CAP理论 分布式系统的CAP理论: 首先将分布式系统中的三个特性进行如下归纳: 口(一致性(C):在分布式系统中的所有数据备份,在同一时刻是否有同样的值。(等于所有节点访问同一份最新的数据副本) 口可用性(A):在集群中一部分节点故障后,集群整体是否还能…

kafka开发环境搭建

文章目录 1 安装java环境1.1 下载linux下的安装包1.2 解压缩安装包1.3 解压后的文件移到/usr/lib目录下1.4 配置java环境变量 2 kafka的安装部署2.1 下载安装kafka2.2 配置和启动zookeeper2.3 启动和停止kafka 1 安装java环境 1.1 下载linux下的安装包 (1&#xf…

快速了解Spring AOP的概念及使用

文章目录 1. AOP概念1.1 什么是AOP?1.2 什么是Spring AOP? 2. Spring AOP的使用2.1 引入Spring AOP依赖2.2 编写AOP程序 3. Spring AOP详解3.1 Spring AOP核心概念1. 切点(Pointcut)2. 连接点(Join Point)3…

如何运用AppLink平台中的数据连接器组件

AppLink平台组件组成 AppLink平台组件分成三个板块触发事件组件、基础组件和数据连接器 数据连接器组件里面有10个组件,目前也在不断新增更多的数据连接器,那他们在AppLink平台里的原理、触发动作以及怎么使用呢?接下来用MySQL和TimescaleD…

在线陪诊系统: 医疗科技的崭新前沿

在医学科技的快速发展中,在线陪诊系统正成为医疗服务领域的创新力量。通过结合互联网和先进的远程技术,这一系统为患者和医生提供了更为便捷、高效的医疗体验。本文将深入探讨在线陪诊系统的技术背后的核心代码和实现原理。 技术背后的关键代码 在线陪…

用于图像分类任务的经典神经网络综述

🎀个人主页: https://zhangxiaoshu.blog.csdn.net 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️,如有错误敬请指正! 💕未来很长,值得我们全力奔赴更美好的生活&…

探索性因子分析流程

探索性因子分析的步骤: 接下来,通过一个案例演示因子分析(探索性因子分析)的各个步骤应该如何进行。 案例:欲探究我国不同省份铁路运输能力情况,收集到部分相关数据如下: 上传数据至SPSSAU系统…

echarts 水波图

echarts 水波图 安装 npm install echarts --save npm install echarts-liquidfill --save引入 import * as echarts from echarts; import echarts-liquidfill;html <div id"chart1" ref"chart1" class"chart1"></div>css .cha…

常见面试题-Redis 切片集群以及主节点选举机制

Redis 切片集群了解吗&#xff1f; 答&#xff1a; Redis 切片集群是目前使用比较多的方案&#xff0c;Redis 切面集群支持多个主从集群进行横向扩容&#xff0c;架构如下&#xff1a; 使用切片集群有什么好处&#xff1f; 提升 Redis 读写性能&#xff0c;之前的主从模式中&…

使用C语言库函数qsort排序注意点

目录 题目背景错误C语言代码&#xff1a;正确C语言代码&#xff1a;注意点 题目背景 高校团委组织校园歌手比赛&#xff0c;进入决赛的校园歌手有10位,歌手编号从1到10进行编号。组委会随机抽取方式产生了决赛次序为&#xff1a;3,1,9,10,2,7,5,8,4,6。比赛现场有5个评委为参赛…