分布式系统概念 | 分布式事务:2PC、3PC、本地消息表

文章目录

  • 分布式事务
  • 2PC(二阶段提交协议)
    • 执行流程
    • 优缺点
  • 3PC(三阶段提交协议)
    • 执行流程
    • 优缺点
  • 本地消息表(异步确保)


分布式事务

分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于分布式系统的不同节点之上。

简言之,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。 本质上来说,分布式事务就是为了保证不同数据库的数据一致性。


2PC(二阶段提交协议)

在分布式系统中,每一个机器节点虽然都能够明确地知道自己在进行事务操作过程中的结果是成功或失败,但是却无法直接获取到其他分布式节点的操作结果(即无法同步结果,一致性无法保证)。

为了保证事务处理的 ACID 特性,就需要引入一个称为协调者的组件来统一调度所有分布式节点的执行逻辑,这些被调度的分布式节点则被称为参与者。协调者负责调度参与者的行为,基于这个思想,衍生出了二阶段提交三阶段提交两种协议。

2PC(Two-Phase Commit): 即二阶段提交,是为了使基于分布式系统架构下的所有节点在进行事务处理过程中能够保持原子性和一致性而设计的一种算法。


执行流程

第一阶段的主要内容就是进行投票,来表明是否有继续执行事务的必要。

阶段一:提交事务请求(投票阶段)

  • 事务询问: 协调者向所有参与者发出事务询问,询问是否可以执行事务操作,并等待各参与者的响应。
  • 执行事务: 各个参与者节点执行事务操作,并将 undoredo 信息记入事务日志中。
  • 各参与者向协调者反馈事务询问的响应: 如果参与者成功执行事务,则反馈 YES 响应;否则反馈 NO 响应。
  • 开启第二阶段: 协调者接收到所有参与者的 YES 响应后进入第二阶段。

在第二阶段中,会根据第一阶段参与者的反馈来决定是否能够提交事务,要么全都成功,要么全都失败。

阶段二:执行事务提交(执行阶段)

  • 执行事务提交
    1. 发送提交请求: 协调者向所有参与者发起提交请求。
    2. 事务提交: 参与者在收到提交请求后,会正式执行事务提交操作。
    3. 反馈事务提交结果: 参与者在完成事务提交之后向协调者发送 ACK 消息。
    4. 完成事务: 协调者接收到所有参与者的 ACK 后完成事务。
  • 中断事务(第一阶段协调者未收到所有参与者的 YES 响应)
    1. 发送回滚请求: 协调者向所有参与者发起回滚请求。
    2. 事务回滚: 参与者在收到回滚请求后,利用阶段一记录的 undo 信息来执行事务回滚操作。
    3. 反馈事务回滚结果: 参与者在完成事务回滚之后向协调者发送 ACK 消息。
    4. 中断事务: 协调者接收到所有参与者的 ACK 后完成事务中断。

事务提交

在这里插入图片描述

优缺点

  • 优点
    1. 原理简单
    2. 实现方便
  • 缺点
    1. 同步阻塞: 在执行过程中,所有参与该事务操作的逻辑都会处于阻塞状态,也就是说各个参与者在等待其他参与者响应的过程中将无法执行其他操作。
    2. 单点问题: 在上述过程中,协调者起到了核心的调度作用。一旦协调者出现了问题,那么整个提交流程将无法运转,甚至如果在二阶段的提交流程中出现了问题,将导致其他参与者都处于锁定事务资源的状态中,无法完成事务。
    3. 数据不一致: 倘若在第二阶段的提交过程中,协调者向所有参与者发送提交请求,由于网络原因导致只有部分参与者收到了提交请求,此时就导致了只有接收到请求的参与者进行了事务提交,而产生数据不一致的问题。
    4. 过于保守: 二阶段提交协议没有设计容错机制,任意一个节点的失败都会导致整个事务的失败。

3PC(三阶段提交协议)

3PC(Three-Phase Commit): 即三阶段提交,为了解决二阶段的缺陷,其将二阶段提交协议的提交事务请求过程一分为二,形成了由 CanCommitPreCommitDoCommint 三个阶段组成的事务处理协议:
在这里插入图片描述

执行流程

阶段一:CanCommit

  1. 事务询问
  2. 各参与者向协调者反馈事务询问的响应

阶段二:PreCommit

  • 执行事务预提交

    1. 发送预提交请求
    2. 事务预提交
    3. 各参与者向协调者反馈事务执行的结果
  • 中断事务

    1. 发送中断请求
    2. 中断事务

阶段三:DoCommit

  • 执行提交
    1. 发送提交请求
    2. 事务提交
    3. 反馈事务提交结果
    4. 完成事务
  • 中断事务
    1. 发送中断请求
    2. 事务回滚
    3. 反馈事务回滚结果
    4. 中断事务

需要注意的是,在阶段三中可能会出现以下两种问题:

  • 协调者出现问题(单点问题)
  • 协调者和参与者之间的网络出现故障(网络拥塞)

无论出现上述那种问题,最终都会导致参与者无法及时的接收到来自协调者的 DoCommit 或是 Abort 请求,针对这种异常情况,参与者都会在等待超时后继续进行事务提交

优缺点

  • 优点: 相较于二阶段提交协议,降低了参与者的阻塞范围,并且能够在出现单点故障后继续达成一致。
  • 缺点: 三阶段提交协议在去除阻塞的同时也引入了新的问题,那就是参与者在收到预提交的消息时,如果出现了网络分区的情况,协调者与参与者无法进行正常的网络通信,但是参与者依旧会进行事务的提交,从而导致数据的不一致

本地消息表(异步确保)

本地消息表业务数据表处于同一个数据库中,这样就能利用本地事务来保证在对这两个表的操作满足事务特性,并且使用了消息队列来保证最终一致性。

  1. 在分布式事务操作的一方完成写业务数据的操作之后向本地消息表发送一个消息,本地事务能保证这个消息一定会被写入本地消息表中。
  2. 之后将本地消息表中的消息转发到消息队列中,如果转发成功则将消息从本地消息表中删除,否则继续重新转发。
  3. 在分布式事务操作的另一方从消息队列中读取一个消息,并执行消息中的操作。

在这里插入图片描述

这里的消息队列不是单纯的数据结构,而应该看作由标志操作两部分共同组成的中间件,用以标识某一操作是否成功,只有当左侧的分布式节点确实完成了某项操作,右侧的其他节点才有同步这项操作的必要。

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

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

相关文章

数据结构算法 | 单调栈

文章目录算法概述题目下一个更大的元素 I思路代码下一个更大元素 II思路代码132 模式思路代码接雨水思路算法概述 当题目出现 「找到最近一个比其大的元素」 的字眼时,自然会想到 「单调栈」 。——三叶姐 单调栈以严格递增or递减的规则将无序的数列进行选择性排序…

最长下降子序列

文章目录题目解法DP暴搜思路代码实现贪心二分思路代码实现题目 给出一组数据 nums,求出其最长下降子序列(子序列允许不连续)的长度。(类似于lc的最长递增子序列) 示例: 输入: 6 // 数组元素个…

Linux 服务器程序规范、服务器日志、用户、进程间的关系

文章目录服务器程序规范日志rsyslogd 守护进程syslog函数openlog函数setlogmask函数closelog函数用户进程间的关系进程组会话系统资源限制改变工作目录和根目录服务器程序后台化服务器程序规范 Linux 服务器程序一般以后台进程(守护进程[daemon])形式运…

IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO

文章目录IO模型阻塞IO非阻塞IO信号驱动IO多路复用IO异步IOIO模型 根据各自的特性不同,IO模型被分为阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO五类。 最主要的两个区别就是阻塞与非阻塞,同步与异步。 阻塞与非阻塞 阻塞与非阻塞最主要的区别就…

Tomcat服务器集群与负载均衡实现

一、前言 在单一的服务器上执行WEB应用程序有一些重大的问题,当网站成功建成并开始接受大量请求时,单一服务器终究无法满足需要处理的负荷量,所以就有点显得有点力不从心了。另外一个常见的问题是会产生单点故障,如果该服务器坏掉…

Linux服务器 | 事件处理模式:Reactor模式、Proactor模式

文章目录Reactor模式Proactor模式同步I/O模型模拟Proactor模式两者的优缺点ReactorProactor同步I/O模型通常用于实现 Reactor 模式,异步I/O模型通常用于实现 Proactor 模式。(不是绝对的,同步I/O也可模拟出 Proactor 模式) React…

Linux服务器 | 服务器模型与三个模块、两种并发模式:半同步/半异步、领导者/追随者

文章目录两种服务器模型及三个模块C/S模型P2P模型I/O处理单元、逻辑单元、存储单元并发同步与异步半同步/半异步模式变体:半同步/半反应堆模式改进:高效的半同步/半异步模式领导者/追随者模式组件 :句柄集、线程集、事件处理器工作流程两种服…

字符串匹配之KMP(KnuthMorrisPratt)算法(图解)

文章目录最长相等前后缀next数组概念代码实现图解GetNext中的回溯改进代码实现代码复杂度分析最长相等前后缀 给出一个字符串 ababa 前缀集合:{a, ab, aba, abab} 后缀集合:{a, ba, aba, baba} 相等前后缀 即上面用同样颜色标识出来的集合元素&#…

Android入门(一) | Android Studio的配置与使用

文章目录安装配置Android Studio使用Android Studio模拟器更改Android SDK的路径Hello World!安装配置Android Studio 从这一步开始: 一直点 next 即可,直到存储路径的选择上,可以放到非 C 盘,这里我放到 D 盘了&am…

Android 入门(四) | Intent 实现 Activity 切换

文章目录Intent显式 Intent定义两个 xml 文件android:orientationmatch_parent 和 wrap_contentIntent函数定义两个 Activity隐式 Intent更多隐式 Intent 的用法用隐式 Intent 打开系统浏览器自建 Activity 以响应打开网页的 Intent向下一个活动传递数据返回数据给上一个活动In…

Android入门(二) | 项目目录及主要文件作用分析

文章目录项目目录分析app目录分析AndroidManifest.xml 分析MainActivity.kt 分析build.gradle 分析最外层目录下的 build.gradleapp 目录下的 build.gradle项目目录分析 我们来看一下 src/main/res 下的一些文件: .gradle 和 .idea :这两个目录下放置…

Android入门(三) | Android 的日志工具 Logcat

文章目录日志工具类 android.util.LogLogcat 中的过滤器日志工具类 android.util.Log Log 从属日志工具类 android.util.Log ,该类提供了五个方法供我们打印日志: Log.v() :用于打印那些最为琐碎的、意义最小的日志信息。对应级别 verbose&…

Android入门(五) | Activity 的生命周期

文章目录Activity 的状态及生命周期实现管理生命周期FirstActivitySecondActivityDialogActivity运行结果旧活动被回收了还能返回吗?Activity 的状态及生命周期 Android 的应用程序运用 栈(Back Stack) 的思想来管理 Activity: …

Android入门(六) | Activity 的启动模式 及 生产环境中关于 Activity 的小技巧

文章目录Activity 的启动模式standardsingleTopsingleTasksingleInstance技巧了解当前界面是哪个 Activity随时随地退出程序启动活动的最佳写法Activity 的启动模式 standard:默认的启动方式,每次启动一个活动都会重新创建singleTop:如果该活…

Android入门(七) | 常用控件

文章目录TextView 控件:文本信息Button 控件:按钮EditText 控件:输入框ImageView 控件:图片ProgressBar 控件:进度条AlertDialog 控件:提示框ProgressDialog 控件:带有进度条的提示框TextView 控…

Android入门(八) | 常用的界面布局 及 自定义控件

文章目录LinearLayout :线性布局android:layout_gravity :控件的对齐方式android:layout_weight:权重RelativeLayout :相对布局相对于父布局进行定位相对于控件进行定位边缘对齐FrameLayout :帧布局Percent &#xff1…

Android入门(九)| 滚动控件 ListView 与 RecyclerView

文章目录ListView内置类型的简单运用定制数据类型提升效率点击事件RecyclerView布局管理器点击事件ListView 内置类型的简单运用 由于手机屏幕空间有限,能够一次性在屏幕上显示的内容不多,当我们的程序有大量数据需要显示的时候就可以借助 ListView 来…

Android入门(10)| Fragment碎片详解

文章目录为什么要使用碎片(Fragment)实例布局文件FragmentActivity动态添加碎片布局文件FragmentActivity碎片通信Fragment布局文件Activity生命周期为什么要使用碎片(Fragment) 我们在手机上看新闻可能是这样的: Re…

Android开发(1) | Fragment 的应用——新闻应用

文章目录Item&#xff1a;标题子项布局文件Java代码标题碎片布局文件Java代码新闻内容碎片布局文件Java代码新闻内容活动布局文件Java代码首界面布局文件Java代码Item&#xff1a;标题子项 布局文件 news_item.xml&#xff1a; <TextViewxmlns:android"http://schema…

Android入门(11)| 全局广播与本地广播

文章目录广播概念接收广播动态注册实例静态注册实例发送广播发送标准广播广播的跨进程特性发送有序广播本地广播广播概念 Android 中的每个应用程序都可以对自己感兴趣的广播进行注册&#xff0c;这样该程序就只会接收到自己所关心的广播内容&#xff0c;这些广播可能是来自系…