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

news2024/12/24 10:02:53

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

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

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

相关文章

碧莲盛 x Tapdata:实时数据如何赋能医疗美容行业,助力医疗决策及个性化服务升级

使用 Tapdata,化繁为简,轻量代替 OGG、DSG 这样的同步工具,以及 Kettle、Informatica、Python 这样的 ETL 工具或脚本,帮助企业在五花八门的数据需求面前,实现“做且仅做最后一次 ETL”的目标,这绝非纸上谈…

TIME_WAIT状态TCP连接导致套接字无法重用实验

理论相关知识可以看一下《TIME_WAIT相关知识》。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<sys/socket.h> #include<errno.h> #include<syslog.h> #inc…

API接口测试工具的主要作用及选择指南

API接口测试是现代软件开发中至关重要的一环。为了确保不同组件之间的无缝集成和功能正常运作&#xff0c;API接口测试工具应运而生。本文将介绍API接口测试工具的主要作用&#xff0c;以及在选择适合项目的工具时需要考虑的因素。 1、功能测试&#xff1a;API接口测试工具的首…

基于Python+requests编写的自动化测试项目-实现流程化的接口串联

框架产生目的&#xff1a;公司走的是敏捷开发模式&#xff0c;编写这种框架是为了能够满足当前这种发展模式&#xff0c;用于前后端联调之前&#xff08;后端开发完接口&#xff0c;前端还没有将业务处理完毕的时候&#xff09;以及日后回归阶段&#xff0c;方便为自己腾出学(m…

Stable Diffusion绘画系列【3】:二次元动漫画风

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

C语言——求π的近似值

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> #include<math.h> int main() {int s;double n,t,pi;t1;pi0;n1.0;s1;while (fabs(t)>1e-6){pipit; nn2; s-s; ts/n;}pipi*4;printf("pi%lf\n",pi);return 0; }这里是求小数点后6位——1e-6&#…

漏洞环境靶场搭建(内含DVWA SQLi-LABS upload-labs等)

一、docker环境搭建(以redhat8为例&#xff0c;centos7命令基本一致) 1、安装docker yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin 2、启动docker systemctl start docker 3、配置镜像加速 vim /etc/docker/daemon.json {"registr…

Linux下基于MPI的hello程序设计

Linux下基于MPI的hello程序设计 一、MPICH并行计算库安装实验环境部署创建SSH信任连接&#xff0c;实现免密钥互相连接node1安装MPICH 3.4配置NFS注意(一定要先看)环境测试 二、HELLO WORLD并行程序设计 一、MPICH并行计算库安装 在Linux环境下安装MPICH执行环境&#xff0c;配…

Photoshop Elements 2023 v21.0(ps简化版)

Photoshop Elements 2023是一款ps简化版图像处理软件&#xff0c;它加入了一些新的功能和工具&#xff0c;以帮助用户更高效地处理图片。 新功能&#xff1a;软件加入了黑科技&#xff0c;采用Adobe Sensei AI技术&#xff0c;主打人工智能&#xff0c;一键P图&#xff0c;新增…

tabs切换,当点击tabItem时候,改变选中样式,以及content内容区域

效果图展示&#xff1a; html原生代码&#xff1a; <div><div class"buttons-row nav-select riskType" style"padding: 10px;"><div class"shoucang-title-box flex-start"><div class"shoucang-title-item active&q…

Django回顾【二】

目录 一、Web框架 二、WSGI协议 三、 Django框架 1、MVC与MTV模型 2、Django的下载与使用 补充 3、启动django项目 补充 5、 Django请求生命周期 四、路由控制 1、路由是什么&#xff1f; 2、如何使用 3、path详细使用 4、re_path详细使用 5、反向解析 6、路由…

The Sandbox 与 Shemaroo Entertainment 达成合作,将宝莱坞标杆作品带入元宇宙

我们非常高兴地宣布与印度领先的媒体和娱乐集团 Shemaroo Entertainment 建立合作伙伴关系。BharatBox 是全新的文化元宇宙中心&#xff0c;将展示印度娱乐业的知名艺术家和品牌。该项目标志着 Shemaroo 将逐步涉足数字领域&#xff0c;将电影传统与最先进的技术相结合&#xf…

算法之插入排序及希尔排序(C语言版)

我们来实现上述排序 一.插入排序. 当插入第i(i>1)个元素时&#xff0c;前面的array[0],array[1],.,array[i-1]已经排好序&#xff0c;此时用array[i的排序码与array[i-1]array[i-2].的排序码顺序进行比较&#xff0c;找到插入位置即将arrayU插入&#xff0c;原来位置上的元…

【小布_ORACLE】Part11-1--RMAN Backups笔记

Oracle的数据备份于恢复RMAN Backups 学习第11章需要掌握&#xff1a; 一.RMAN的备份类型 二.使用backup命令创建备份集 三.创建备份文件 四.备份归档日志文件 五.使用RMAN的copy命令创建镜像拷贝 文章目录 Oracle的数据备份于恢复RMAN Backups1.RMAN Backup Concepts&#x…

安卓开发学习---kotlin版---笔记(一)

Hello word 前言&#xff1a;上次学习安卓&#xff0c;学了Java开发&#xff0c;简单的搭了几个安卓界面。这次要学习Kotlin语言&#xff0c;然后开发安卓&#xff0c;趁着还年轻&#xff0c;学点新东西&#xff0c;坚持~ 未来的你会感谢现在努力的你~ 主要学习资料&#xff1a…

使用Python进行帧提取及指定帧插入实现文本隐写(CTF杂项出题方向)

视频是由一系列连续的图像帧组成的&#xff0c;每一帧都是视频的静止画面。这些帧以一定的速率播放&#xff0c;就形成了运动的视频。以下是视频帧的一些基本概念&#xff1a; 帧率&#xff08;Frame Rate&#xff09;&#xff1a; 帧率表示每秒播放的图像帧数量。通常以“帧/秒…

性能自动化测试?

一、思考❓❔ 1.什么是性能自动化测试? 性能 系统负载能力超负荷运行下的稳定性系统瓶颈 自动化测试 使用程序代替手工提升测试效率性能自动化 使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集参数&#xff0c;统计系统负载能力生成报告 2.Python中的性能…

【JavaEE初阶】——Linux 基本使用和 web 程序部署(下)

文章目录 前言一、Linux 常用命令 1.1 ls 命令 1.2 pwd 命令 1.3 cd 命令 1.4 touch 命令 1.5 cat 命令 1.6 mkdir 命令 1.7 rm 命令 1.8 cp 命令 1.9 mv 命令 1.10 man 命令 1.11 less 命令 1.12 head 命令 1.13 tail 命…

leetcode LCR24反转单链表

反转单链表 题目描述 题目分析 先来说迭代的思想&#xff1a; 上面next cur->next应该放在cur->next pre前面执行&#xff0c;这里笔误 再来说递归的思想&#xff1a; 题目代码 这个代码里面我加了我自己写的测试数据&#xff0c;自己可以去找对应的部分&#xff0c…

Charles下载安装及配置之Mac

因工作需要用到抓包工具&#xff0c;但Fiddler不能在mac上使用&#xff0c;所以找到了Charles&#xff0c;Charles其实是一款代理服务器&#xff0c;通过过将自己设置成系统&#xff08;电脑或者浏览器&#xff09;的网络访问代理服务器&#xff0c;然后截取请求和请求结果达到…