微服务架构下的分布式事务

系统软件为了实现一定的业务,会将现实中的人、事、物进行抽象表示,并将其映射为系统中的模型。

业务模型大致可以按以下来构建:
1、定义系统中应该存在哪些实体、实体上有哪些属性。
2、定义实体之间的各种拓扑关系,如从属、嵌套、多对多。
3、定义实体和属性的动态关系,即定义系统流程

第1、2步是静态的,因此可以用E-R图(实体-关系图)来表示,它能够描述系统在某个时间节点所有可能的状态,第3步需要用流程图和“状态-转移图”来表示,它能够描述系统随着时间的推移的变化规律。

业务模型是系统中最容易发生变化的部分,体现在:
1、系统中的实体、属性种类的增减
2、实体之间拓扑关系的改变
3、系统流程变更

数据库是负责存储这些业务模型的。数据存储模型的设计就是数据库的设计,工作包括:数据存储结构、索引结构、读写控制。实体对应到表、实体的属性对应到表中的字段,遵循数据库设计范式减少冗余的表和字段。

单体应用时代通常采用单一的关系数据库,微服务时代并不再受限于单一数据库,微服务架构下,服务可以选择专精于相应领域中的数据库,如搜索引擎数据库Elasticsearch,分布式存取海量数据的MongoDB等。

软件系统为了保证业务模型上的状态的互斥完备,就要求存储模型也是互斥完备的。从数据库角度来看,就是数据库中某些表中的字段必须同时变化;从数据库客户端来看就是对数据库进行一组写入操作,要么成功,要么失败。这就是所谓的事务。

事务的特点ACID:
1、A(Atomicity)原子性,在同一组数据库操作中,其中某一步失败了,之前的所有操作都会被回滚,不允许出现部分成功,部分失败的情况。
2、C(Consistency)一致性,即数据操作符合某种业务约束。比如说A账户转钱给B账户,那么对于两个账户的钱的增减,应该符合A账户钱会减少,B账户应该增多。这就是一个比较简单转账业务逻辑。符合相应的业务逻辑就达到了一致性要求。
3、I(Isolation)隔离性,并发的数据操作要有一定的隔离性,隔离性最差的情况是并发操作没有一点隔离、互相干扰;最好的情况是并发操作等效于一系列串行操作。隔离性越高也意味着数据库需要更多的资源来实现,存取数据的吞吐量也会随之降低、延迟增加。
4、D(Durability)持久性,要求到达数据库的数据不会丢失,换据话说就是存储到了外存中,计算机停电、重启等条件都不会导致数据丢失。

分布式系统的出现,尤其是分布式数据库,相比较于单体应用和传统的数据库来说,除了要满足ACID标准事务上,分布式系统还有一个问题尚未等到解决。就是常说的CAP三选二定理。

1、C(Consistency):一致性,就是说分布式系统的任何节点对同一个Key的读写请求的结果都是完全一致的。
2、A(Availability):可用性,就是每次请求都能够得到及时并正常的响应,但是不保证数据是最新的。
3、P(Partition tolerance)分区容错性,节点不能连通时,不能保持正常的运转。

这三个特性不能同时满足,只能满足其中两个。

有人是这么说的,因为P分区容错性通常是无法避免的既定事实,如果不存在网络分隔,又或者说不要求在出网络隔离时,仍然要正常提供服务,那么对于这种情况完全可以放弃分布式架构,直接用集中心架构来做就可以。所以现在变成了,接受P,在C和A之间根据业务需要进行选择。
1、选择C一致性,放弃A可用性,就是要强一致性,低可用性。在这类系统中,写入数据库的请求只在提交并且同步到所有的数据库节点后才会返回响应,任意一个节点出现故障都会导致服务整体不可用,直至故障修复。账务金融领域的系统通常会采用这种架构。
2、选择A可用性,放弃C一致性,就是要高可用,最终一致性。在这类系统中,写入数据库的请求只要在部分数据库节点上成功提交即可立即返回响应,不需要等到数据同步到所有数据库节点才返回。使用这样的架构可以提供服务的可用率,只有要少数据存活的服务节点,服务就可用。坏处是写入数据请求完成后的一段时间(无上限)内,读取同一条数据的结果可能会有一定的概率是错误的,这种数据约束称为BASE(Basically Available Soft state Eventually consistent)。
(1)基本可用:通过使用分布式数据库,尽可能使用读写操作处于可用的状态,但不保证数据的一致性,如数据可能没有被持久化、或读回的数据不是最新的。
(2)软状态:即某条数据在写入后一段时间内的状态是未知的,在最终收敛之前,系统有一定概率会返回最新的值。
(3)最终一致性:在系统功能正常的前提下,等待足够长的时间之后,某条数据在系统中的状态能够收敛达成一致,之后,读取到的数据都是最新的。

如果分布式系统如果采用了分布式甚至是异构的数据存储方案,那么在写顺序方向可能会遇到问题: 同一条数据在不同服务上并发写入时,可能会因为写入顺序不同而导致写入的数据不一致。这种问题并不一定违反了BASE或ACID约束,但前业务模型的角度来看,这不是预期的结果,系统不能正确反映业务模型。比如说现在A、B、C三个服务各自使用了不同的数据库,现在有两个请求1和请求2,并发修改同一个数据项,这个数据项分别由这三个服务进行处理,由于网络延迟,这个数据项在三个数据库中的值可能会不一致,如在A中为100,在C中为200.

现在业界已有一些分布式事件框架方案:
1、XA标准和二阶段提交协议
XA标准(eXtended Architecture 扩展后的架构)这个标准目的是尝试提供一套分布式事务的处理的标准。它描述了全局的事务管理与局部的资源管理器之间的接口。通过这套接口,应用可以在同一事务中跨越多个服务访问多个资源(如数据库、队列、服务)。这个标准使用了两阶段提交协议(two-phase commit,2PC)来保证所有资源同时提交或回滚任何特定的事务。

两阶段提交协议引入协调者角色,它负责统一掌握所有数据存储节点(参与者)的操作结果:
第一阶段:参与者并发进行数据操作,将结果是否成功通知协调者;
第二阶段:协调者根据所有参与者的反馈,决定是确认提交还是中止操作,并将这个决定告知所有参与者。

XA标准和二阶段提交协议的好处是:强一致性,实现数据在多个数据库上的ACID约束;业务侵入性也小,完全依赖各个数据库本身劫持实现分布式事务,不需要修改业务逻辑。坏处是:数据库的选型受限,只能选择支持XA标准的数据库;其次就是单点故障降低可用性,所有节点都不能出错;支持XA标准的数据库在设计上有大量的阻塞和资源占位,数据体量和吞吐量扩展性差。

总结来说XA标准和二阶段提交协议是强一致性,低可用性的方案,正好是金融行业常用的架构。

2、Saga分布式事务框架
它的思路是借助驱动流程机制,按顺序执行每个数据操作步骤。一旦出错,就倒序执行之前各步骤对应的“补偿”操作。所以Saga要求每个步骤涉及的服务都要提供正向操作接口和对应的补偿操作接口。
Saga框架通过对一些基础服务进行组合/编排来完成各种业务需求,比较灵活,对数据库也没有什么特别的要求,甚至不要数据库。它只满足了ACID中的A和C。需要服务实现数据补偿的操作,这工作会增加开发和维护的成本。

Saga目前有Saga Orchestration 和Choreography两种实现。

3、ACID事务链的分布式事务框架

ACID事务链要求参与分布式事务的所有服务都要使用支持ACID事务的数据库,在每个服务内部,都将数据操作和同步调用相邻服务的操作打包到一个ACID事件中,通过ACID事务的链式调用来实现分布式事务。它的优点相当明显就是支持ACID。回滚的操作由支持ACID数据库执行。缺点也明显数据库选型受限,服务耦合过多,服务之间的依赖是链式拓扑,非常不方便调整,如果出现服务之间的循环依赖,会出现很多麻烦。

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

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

相关文章

2023五岳杯量子计算挑战赛数学建模思路+模型+代码+论文

赛题思路:12月6日晚开赛后第一时间更新,获取见文末名片 “五岳杯”量子计算挑战赛,是国内专业的量子计算大赛,也是玻色量子首次联合移动云、南方科技大学共同发起的一场“企校联名”的国际竞赛,旨在深度融合“量子计算…

Python处理Excel文件并与数据库匹配做拼接

Python处理Excel文件并与数据库匹配做拼接 需求:Python处理Excel中数据并于数据库交互匹配得到账号信息等其他操作 Python实现 import os import pandas as pd import pymssql import warnings import time# 提取速率函数 def extract_broadband_speed(speed):if…

【外观模式】SpringBoot集成mail发送邮件

前言 发送邮件功能,借鉴 刚果商城,根据文档及项目代码实现。整理总结便有了此文,文章有不对的点,请联系博主指出,请多多点赞收藏,您的支持是我最大的动力~ 发送邮件功能主要借助 mail、freemarker以及rocke…

Java 泛型相关知识

什么是泛型? Java 泛型(generics)是JDK5中引入的一种参数化类型特性。 为什么使用泛型,使用泛型的好处? 代码更健壮(只要编译期没有警告,那么运行期就不会出现 ClassCastException)代码更简洁(不用强转)代码更灵活,复用什么是参数化类型: 把类型当参数一样传递<…

C语言绝对值得一看的常识讲解:柔性数组补充篇

今天突然看到一个比较特别的知识点——柔性数组。它是在C99中出现的一种特别的数组&#xff0c;具体是指结构体中的最后一个元素允许是未知大小的数组&#xff0c;这就叫做『柔性数组』成员。 目录 1.柔性数组的定义 2.柔性数组的特点 3.柔性数组的使用举例 4.柔性数组的优…

React基础语法整理

安装&#xff1a; yarn create react-app reatc-lesson --template typescript yarn create 创建一个react-app的应用 项目名称 typescript 的模板react-app 官方地址 https://create-react-app.bootcss.com/docs/adding-typescriptreact 语法文档 https://zh-hans.react.dev…

Vue笔记(一)基础

VUE 官方文档&#xff1a;https://cn.vuejs.org/ 创建VUE项目 前提&#xff1a;已安装 16.0 或更高版本的 Node.js 进入要创建的目录&#xff0c;执行命令&#xff1a;npm create vuelatest 安装依赖&#xff0c;启动&#xff1a; //进入项目目录&#xff0c;运行命令安装依赖…

基于Vue框架的电子商城购物平台小程序的设计与开发

基于JavaWebSSMVue电子商城购物平台小程序系统的设计和实现 源码获取入口KaiTi 报告/Ren务书Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 KaiTi 报告/Ren务书 一、选题的目的和意义 自从微信推出了微信小程序…

使用命令行移除VSAN中故障磁盘

原创作者&#xff1a;运维工程师 谢晋 使用命令行移除VSAN中故障磁盘 前提故障盘移除 前提 客户有套VSAN环境内有一台服务器的磁盘组出现了一块故障的数据盘&#xff0c;但该盘已经处于完全掉线状态&#xff0c;无法进行正常移除。如下图&#xff1a; 如果遇到这种情况&am…

P9 LinuxC 进程概述 终端启动的程序父进程是终端

前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨✨✨ &#x1f6f8;推荐专栏3: ​​​​​​《链表_ChenP…

【1】一文读懂PyQt简介和环境搭建

目录 1. PyQt简介 1.1. Qt 1.2. PyQt 1.3. 关于PyQt和PySide 2. 通过pip安装PyQt5 3. 无法运行处理 4. VSCode配置PYQT插件 PyQt官网:Riverbank Computing | Introduction 1. PyQt简介 PyQt是一套Python的GUI开发框架,即图形用户界面开发框架。 Python中经常使用的GU…

FreeRTOS的内存管理方法(超详细)

内存管理 我们知道每次创建任务、队列、互斥锁、软件定时器、信号量或事件组时&#xff0c;RTOS 内核都需要 RAM &#xff0c; RAM 可以从 RTOS API 对象创建函数内的 RTOS 堆自动动态分配&#xff0c; 或者由应用程序编写者提供。 如果 RTOS 对象是动态创建的&#xff0c;那么…

Leetcode—2646.最小化旅行的价格总和【困难】

2023每日刷题&#xff08;五十三&#xff09; Leetcode—2646.最小化旅行的价格总和 算法思想 看灵神的 实现代码 class Solution { public:int minimumTotalPrice(int n, vector<vector<int>>& edges, vector<int>& price, vector<vector&l…

发现数学之美--微积分的起源和用途(一文搞懂微积分)

数学&#xff0c;改变世界的基石。微积分十九世纪的三大自然发现之一&#xff0c;迪卡尔建立了解析几何&#xff0c;把数与图结合在一起&#xff0c;微积分的发现与创立&#xff0c;是数学新的里程碑&#xff0c;解决了常规方法无法解决的问题&#xff0c;是一次伟大的革命。迪…

服务器数据损坏了有办法修复吗 ?

对于企业网站来说&#xff0c;数据库往往是服务器中最核心的部分&#xff0c;所以一旦数据库发生损坏&#xff0c;将会给企业带来巨大的损失&#xff0c;因 此数据库的数据恢复功能变得越来越重要了。在服务器运行过程中&#xff0c;由于断电、操作不当或者是客观原因损坏到服务…

git安装和配置

git安装和配置 一、软件介绍 Git是一个免费开源的分布式版本控制系统&#xff0c;旨在快速高效地处理从小型到大型项目的所有内容。 Git易于学习&#xff0c;占地面积小&#xff0c;性能闪电般快。它以廉价的本地分支、方便的暂存区域和多个工作流等功能胜过了Subversion、C…

linux 常用指令目录大纲

Linux下的Signal信号处理及详解&#xff0c;test ok-CSDN博客 Linux下怎样判断一个binary是否可以debug//test ok_感知算法工程师的博客-CSDN博客 linux file命令的用法//test ok-CSDN博客 linux下生成core dump方法与gdb解析core dump文件//test ok-CSDN博客 linux readel…

【论文阅读】Reachability and distance queries via 2-hop labels

Cohen E, Halperin E, Kaplan H, et al. Reachability and distance queries via 2-hop labels[J]. SIAM Journal on Computing, 2003, 32(5): 1338-1355. Abstract 图中的可达性和距离查询是许多应用的基础&#xff0c;从地理导航系统到互联网路由。其中一些应用程序涉及到巨…

第7节:Vue3 动态绑定多个属性

可以使用v-bind指令将多个属性动态绑定到元素上。以下是一个简单的实例&#xff1a; <template><view class"container"><text v-bind"dynamicProps">{{ message }}</text><button click"toggleActive">切换激活…

金南瓜SECS/GEM C# SDK 快速使用指南

本文对如何使用金南瓜SECS/GEM C# SDK 快速创建一个满足SECS/GEM通信要求的应用程序&#xff0c;只需简单3步完成。 第一步&#xff1a;创建C# .NET程序 示例使用Visual Studio 2010&#xff0c;使用者可以选择更高级版本 Visual Studio 第二步&#xff1a;添加DLL库引用&am…