当前位置: 首页 > 编程日记 > 正文

cap理论与分布式事务的解决方案

现在很火的微服务架构所设计的系统是分布式系统。分布式系统有一个著名的CAP理论,即一个分布式系统要同时满足一致性(Consistency)、可用性(Availablility)和分区容错(Partition Tolerance)三个特性是一件不可能的事情。

CAP理论的简介

CAP理论是由Eric Brewer在2000年的PODC会议上提出的,该理论在两年后被证明成立。

CAP理论告诉架构师不要妄想设计出同时满足三者的系统,应该有所取舍,设计出适合业务的系统。

一致性(Consistency):一致性指的是数据的强一致性。每次的读操作都是读取的最新数据。即如果写入某个数据成功的话,之后的读取都应该读的是新写入的数据;如果写入失败的话,之后读取的都不应该是写入失败的数据。

可用性(Availability):可用性指的是服务的可用性。即每个请求都能在合理的时间内获得符合预期的响应结果。

分区容错性(Partition Tolerance):分区容错性指的是当节点之间的网络出现问题之后,系统仍然能够正常提供服务。

在分布式的系统中,P是基本要求,而单体应用则是CA系统。微服务系统通常是一个AP系统,即同时满足可用性和分区容错性。这样就有了一个在分布式系统中保证数据强一致性的难题,这个难题的一个解决方案就是分布式事务。

分布式事务的解决方案

在微服务系统中,每个服务都是独立的进程单元,每个服务都有自己的数据库。在通常情况下,只有关系型数据库在特定的数据引擎下才会支持事务(本地事务),而大多数非关系型数据库是不支持事务的,比如MongDB完全不支持事务,而Redis是支持事务的,虽然支持得不完整。

两阶段提交

网上购物在日常生活中是一个非常普通的场景,假设静静在某宝上购买了一个玩具,需要从静静的账户中扣除200块钱,同时玩具的库存数量需要减1,卖家的账户中增加200块钱。

如果这是一个单体应用,并且使用支持事务的数据库(比如InnoDB数据库引擎的MySQL、Oracle和SQL Server等),我们可能是这样写代码的:

@Transactional
public void update() throws RuntimeException{updateAccountTable(); // 更新账户表updateGoodsTable(); // 更新商品表
}

如果是微服务架构的话,账户是一个服务,商品是一个服务,两个独立的服务就不能使用数据库自带的事务了,因为这两个数据表可能并不在一个数据库中,这就需要用到两阶段提交的解决方案。

第一阶段,service-account发起一个分布式事务,交给事务式事务TC处理,事务协调器TC向所有参与事务的节点发送处理事务操作的准备操作。所有参与节点执行准备操作,将Undo和Redo信息写入日志中,并向事务管理器返回准备操作是否成功的消息。

第二阶段,事务管理器收集所有节点的准备操作是否都成功,如果都成功的话则通知所有的节点执行提交操作,如果有一个失败则执行回滚操作。

两阶段提交将事务分成了两个部分,大大提高了分布式事务的成功概率。然而,如果在第一阶段都成功了,而执行第二阶段的某一个节点失败,仍然会导致数据不准确。这种情况下一般需要人工去处理,这也是为什么要在第一步记录日志的原因。

另外,如果分布式事务涉及的节点很多,一旦某一个节点的网络出现异常,就会导致整个事务处于阻塞状态,大大降低数据库的性能。因此如果不是必要的话,建议是尽量少用分布式事务,有些时候过度设计反而会造成相反的效果。

三阶段提交

三阶段提交在两阶段提交的步骤中间加了一层预提交事务阶段。

1.CanCommit阶段。这个阶段和上面说的两阶段提交的准备阶段类似,不同的地方就是并没有进行诸如将Undo和Redo的信息写入事务日志的其他操作。

2.PreCommit阶段。这个阶段是一个缓冲,目的是推迟Commit的决定,只有保证所有参与者都知道了Commit的决定之后,才会真正发出Commit的决定。所有的参与者都会在这个阶段记录Undo和Redo的信息,并且当协调者发生故障之后,所有的参与者还能互相通信来确定事务是提交还是终止。

3.DoCommit阶段。这个阶段就是事务的真正提交,如果所有的参与者都向协调者发送了ACK响应,那么协调者就会完成事务,否则中断事务。

三阶段提交的方案引入了对参与者的超时机制,相比于两阶段提交只有协调者拥有超时的机制,三阶段提交解决了协调者突然挂掉引起的参与者一直阻塞的问题。

本质上来说,三阶段提交避免了状态停滞的问题。在两阶段提交的过程中有可能会因为各种原因产生状态停滞的问题,最明显的就是协调者突然宕机的情况。但是三阶段提交即使是协调者宕机也会让状态继续下去,参与者们也会互相通信确定事务是提交还是终止,从而使状态继续下去,哪怕状态是错的。

"在心碎中认清遗憾,生命漫长也短暂。"

转载于:https://www.cnblogs.com/yanggb/p/11244250.html

相关文章:

Blender中的多平面动画学习教程

技能分享–Blender中的多平面动画 Skillshare – Multiplane Animation in Blender 语言:英语中英文字幕(根据原英文字幕机译更准确) 大小解压后:1.34G 含课程素材 信息: 我们将在这堂课中致力于创建一个2D多平面相机效果&#xf…

BestCoder Round #68 (div.2) 1002 tree

题意&#xff1a;给你一个图&#xff0c;每条边权值0或1&#xff0c;问每个点周围最近的点有多少个&#xff1f; 思路&#xff1a;并查集找权值为0的点构成的连通块。 1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 #include<math.h>…

Java学习总结:56(Stack子类)

Stack子类 Stack表示栈操作&#xff0c;栈也是一种动态对象数组&#xff0c;采用的是一种先进后出的数据结构形式&#xff0c;即在栈中最早保存的数据最后才会取出&#xff0c;而最后保存的数据可以最先取出。Stack类的定义如下&#xff1a; public class Stack<E>exte…

2022-2028年中国大理石料行业市场研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国大理石料行业市场行业相关概述、中国大理石料行业市场行业运行环境、分析了中国大理石料行…

ActionScript 3操作XML 详解

AS3引入了E4X &#xff0c;它是根据ECMAScript标准处理XML 数据的全新机制。这使得程序员在程序中无缝地操作XML。在AS3中可以使用XML字面值将XML数据直接写入代码&#xff0c;该字面值将被自动解析。 一、AS3中的XML入门 1.可以将XML直接写入代码 public var employeelist:XML…

kubernetes关键特性和概述

kubernetes关键特性和概述 https://blog.csdn.net/u014042372/article/details/80573213 posted on 2019-08-16 11:23 竹径风声 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/girl1314/p/11362768.html

Blender创作你自己的动画短片学习教程

Filmmaking with Blender – Create your own animated Short Film 时长:1h 20m |视频:. MP4 1280720&#xff0c;30 fps(r) |音频:AAC&#xff0c;44100 Hz&#xff0c;2ch |大小:1G 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 在本课…

Java学习总结:57(Properties子类)

Properties子类 Properties类本身是Hashtable的子类&#xff0c;但是由于Properties类都使用String数据类型进行操作&#xff0c;所以在使用Properties类时主要使用本类所定义的方法。Properties类常用方法如下&#xff1a; No.方法类型描述1public Object setProperty(Strin…

openwrt入门

一、安装Ubuntu(在vware安装) 注意使用图形系统 二、安装openwrt开发工具 1.打开命令窗CtrlAltT&#xff0c;切换到root用户&#xff1a;sudo -sH或sudo su&#xff0c;退出root用户&#xff1a;CtrlD或exit 2.切换到root&#xff0c;下载安装组件&#xff08;apt-get install …

2022-2028年中国大飞机项目产业链分析及投资咨询报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国大飞机项目行业市场行业相关概述、中国大飞机项目行业市场行业运行环境、分析了中国大飞机…

一种可以避免数据迁移的分库分表scale-out扩容方式

原文地址&#xff1a;http://jm-blog.aliapp.com/?p590目前绝大多数应用采取的两种分库分表规则mod方式dayofweek系列日期方式&#xff08;所有星期1的数据在一个库/表,或所有?月份的数据在一个库表&#xff09;这两种方式有个本质的特点&#xff0c;就是离散性加周期性。例如…

openstack对比其他有什么优点

openstack对比其他有什么优点 &#xff08;1&#xff09;模块松耦合。与其他开源软件相比&#xff0c;OpenStack模块分明。添加独立功能的组件非常简单。有时候&#xff0c;不需要通读整个OpenStack的代码&#xff0c;只需要了解其接口规范及API使用&#xff0c;就可以轻松地添…

C#和Unity编码和游戏开发学习教程

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:110节课(26小时25分钟)|大小解压后:18.6 GB 含课程文件 学习C#和Unity编码和游戏开发 The Ultimat…

Linux命令行与命令

Linux命令行与命令 作者&#xff1a;Vamei 出处&#xff1a;http://www.cnblogs.com/vamei 欢迎转载&#xff0c;也请保留这段声明。谢谢&#xff01; Linux的命令是很重要的工具&#xff0c;也往往是初学者最大的瓶颈。有朋友用了很长时间的Linux图形界面&#xff0c;基本不使…

Java学习总结:58(Collections工具类)

Collections工具类 Java提供了一个集合的工具类——Collections&#xff0c;这个工具类可以实现List、Set、Map集合的操作。Collections类的常用方法如下&#xff1a; No.方法类型描述1public static < T > boolean addAll(Collection<? super T> c,T…elements…

2022-2028年中国醋酸行业投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国醋酸行业市场行业相关概述、中国醋酸行业市场行业运行环境、分析了中国醋酸行业市场行业的…

[转] linux系统文件流、文件描述符与进程间关系详解

http://blog.sina.com.cn/s/blog_67b74aea01018ycx.html linux&#xff08;unix&#xff09;进程与文件的关系错综复杂&#xff0c;本教程试图详细的阐述这个问题。包括&#xff1a;1、linux多/单进程与多/单文件对于文件流和描述符在使用时的关联情况及一些需要注意的问题。2、…

VMware虚拟机 取消 简易安装

我的VMware更新到12.0版本了&#xff0c;突然有了个简易安装操作系统&#xff0c;不得不承认这个功能很省事&#xff0c;如果没有特殊要求&#xff0c;这样安装虚拟机既快速有稳定。 但是专业人士总是要专门的服务&#xff0c;追求自动化&#xff0c;往往忽略一些细节上的东西。…

UE5蓝图初学课程 Unreal Engine 5: Blueprints for Beginners

时长:6h 51m |视频:. MP4 1280720&#xff0c;30 fps(r) |音频:AAC&#xff0c;44100 Hz&#xff0c;2ch |大小解压后:4.4 GB 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 没有编码的游戏开发 开发一个高质量的游戏&#xff0c;不需要写…

SQL基础学习总结:1(数据库)

数据库 我们通常将可以将大量数据保存下来&#xff0c;通过计算机加工而成的可以进行高效访问的数据集合称为数据库&#xff0c;简称&#xff1a;DB。 而用来管理数据库的计算机系统则称之为数据库管理系统&#xff0c;简称&#xff1a;DBMS。一般情况下&#xff0c;系统的使用…

MyEclipse安装Freemarker插件

以下是安装Freemarker插件并设置MyEclipse使用该插件的步骤&#xff1a;1、下载Freemarker插件 打开http://sourceforge.net/projects/freemarker-ide/files/ 2、解压&#xff0c;将hudson.freemarker_ide_0.9.14文件夹放入eclipse下的plugins文件夹。 发现hudson.freemarker_…

单例模式为什么使用volatile,以及双重检查&单例模式的一些思考

也就是第一个if(singleton==null),这个是为了代码提高代码执行效率,由于单例模式只要一次创建实例即可,所以当创建了一个实例之后,再次调用getInstance方法就不必要进入同步代码块,不用竞争锁。直接返回前面创建的实例即可。

2022-2028年中国IT外包市场投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国IT外包行业市场行业相关概述、中国IT外包行业市场行业运行环境、分析了中国IT外包行业市场…

iOS,Android,WP, .NET通用AES加密算法

这两天为移动App开发API&#xff0c;结果实现加密验证时碰到一大坑。这里不得不吐槽下又臭又硬的iOS&#xff0c;Windows Server无法解密出正确的结果&#xff0c;Android则可以&#xff0c;后来使用了通用的AES256加密算法才最终搞定。 搞服务器端小伙伴没有接触过iOS&#xf…

【Linux】Linux下的硬链接与符号链接

Linux的初学者常常混淆Linux中的硬链接&#xff08;hard link&#xff09;与符号链接&#xff08;symbol link&#xff09;的概念&#xff0c;分不清楚它们的区别。因此&#xff0c;本文将向读者全面介绍硬链接与符号链接&#xff0c;给予读者以全面的认识。 1.Linux下的文件系…

Unity + SQL数据库创建管理玩家排行榜学习教程

Unity SQL Databases Player Management Leaderboards More! Unity SQL数据库玩家管理排行榜更多&#xff01; MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&…

SQL基础学习总结:2(表的创建、删除、更新和名称修改)

表的创建、删除、更新和名称修改 登录MySQL(mysql -u root -p语句) 步骤&#xff1a; 1.首先得先使用mysql -u root -p语句登录数据库&#xff1b; 2.在"Enter password:"后面输入你设置的密码&#xff0c;然后就登录到MySQL可以进行数据库得操作了。 如下图&#…

需要抛出异常的情况

1、调用一个抛出已检查异常的方法。例如FileInputStream构造器。 2、程序运行中发现错误&#xff0c;并且利用throw语句抛出一个已检查异常。 3、程序出现错误。例如a[-1]0会抛出一个ArrayIndexOutOfBoundsException异常。 4、Java虚拟机和运行时库出现的内部错误。 对于可能会…

2022-2028年中国HDPE膜行业市场研究及投资发展分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国HDPE膜行业市场行业相关概述、中国HDPE膜行业市场行业运行环境、分析了中国HDPE膜行业市场…

linux+postfix+extmail+dovecot搭建邮件服务器

一、我们可以重新搭建服务器&#xff0c;也可以利用我前面的搭建方法编译安装&#xff0c;地址&#xff1a;http://wangzan18.blog.51cto.com/8021085/1605480&#xff0c;本次我们使用yum的方法来安装httpd和mysql&#xff0c;我的搭建环境还是我们的CentOS6.6 x86-64位mini版…