【微服务设计】从理论到实践:2PC(两阶段提交)与SAGA的全面比较与示例

news2024/11/17 6:09:55

在现代分布式系统中,事务一致性是一个重要的挑战。为了解决这一问题,业界提出了多种事务处理协议,其中两阶段提交(2PC)和SAGA是两种常见的方法。本文将详细介绍这两种协议的原理、应用场景及其优缺点,并通过具体示例加以说明。


1. 2PC与SAGA的异同及示例说明

两阶段提交(2PC)

概述:两阶段提交协议(2PC)是一种基于锁的分布式事务协议,由两个阶段组成:准备阶段(Prepare)和提交阶段(Commit)。在准备阶段,所有参与节点(参与者)都会准备好事务,如果所有节点都准备好,则进入提交阶段,否则事务会被回滚。

优点

  • 简单易实现,适用于小规模系统。
  • 确保了全局一致性。

缺点

  • 存在单点故障风险,协调者故障会导致事务挂起。
  • 需要锁住资源,可能导致较高的资源开销和系统延迟。

示例:银行转账

  1. 准备阶段
    • 转出银行系统:检查用户A账户余额并暂时锁定1000元。
    • 转入银行系统:准备接收1000元。
  2. 提交阶段
    • 转出银行系统:确认并正式扣除1000元。
    • 转入银行系统:确认接收1000元并增加用户B账户余额。

SAGA

概述:SAGA是一种分布式事务管理模式,通过将事务拆分为一系列独立的子事务,并为每个子事务定义相应的补偿操作来实现事务一致性。每个子事务独立提交,如果某个子事务失败,则按相反的顺序执行前面已成功子事务的补偿操作。

优点

  • 不需要锁住资源,提高了系统的可用性和性能。
  • 更灵活,适用于长时间运行的事务。

缺点

  • 实现复杂,需要为每个子事务定义补偿逻辑。
  • 在某些场景下,可能无法完全保证强一致性。

示例:在线订单处理

  1. 子事务1:创建订单:创建订单并保存订单信息。补偿操作:删除已创建的订单。
  2. 子事务2:预扣库存:预扣商品库存。补偿操作:恢复已预扣的库存。
  3. 子事务3:处理支付:扣减用户账户余额。补偿操作:退款给用户。
  4. 子事务4:确认订单:将订单状态更新为已确认。补偿操作:回滚订单状态。

2. SAGA和2PC一样需要一个独立的协调者吗?

在2PC中,协调者(Coordinator) 是一个独立的实体,负责管理整个事务的生命周期。在准备阶段,协调者向所有参与者(Participants)发送准备请求,并收集他们的响应。在提交阶段,协调者根据参与者的反馈决定是提交还是回滚事务。协调者的故障会导致整个事务无法完成,因此它是系统的单点故障。

在SAGA模式中,协调者 的角色更加灵活和去中心化。SAGA的协调者通常是分布式事务管理器,它负责启动每个子事务,并在需要时执行补偿操作。然而,每个子事务自身知道如何进行补偿操作,因此协调者的职责不是控制所有操作,而是协调和触发这些操作。协调者的失效不会立即导致整个系统不可用,因为子事务和补偿逻辑是独立的。

比较

  • 2PC需要一个集中的、独立的协调者来管理事务的整个生命周期,确保所有参与者的一致性。
  • SAGA的协调者角色更去中心化,主要负责触发和协调事务和补偿操作,子事务自己负责状态管理和补偿逻辑,系统更具容错能力。

3. 事务回滚和补偿操作有什么异同?

事务回滚(Rollback)

概念:事务回滚是指在事务执行过程中,如果某个步骤失败,系统会撤销已经完成的所有步骤,恢复到事务开始之前的状态。

特点

  • 原子性:事务要么完全成功,要么完全失败,不会有中间状态。
  • 锁机制:通常依赖于锁机制,确保在回滚过程中数据的一致性。
  • 同步操作:回滚操作是同步进行的,一旦失败,立即撤销所有已完成的操作。

适用场景:适用于需要强一致性和短时间运行的事务,如银行转账、库存更新等。

补偿操作(Compensation)

概念:补偿操作是在分布式事务中,每个子事务都有对应的补偿操作,以便在某个子事务失败时,撤销之前已经成功的子事务操作。

特点

  • 灵活性:每个子事务独立执行和提交,失败时通过补偿操作撤销已完成的部分。
  • 异步操作:补偿操作可以异步进行,提高系统的并发性能和可用性。
  • 无锁机制:通常不依赖于锁机制,更适合长时间运行的事务。

适用场景:适用于需要高可用性和灵活处理失败情况的分布式事务,如电商订单处理、复杂业务流程等。

总结

通过以上的比较与示例,我们可以看出两阶段提交(2PC)和SAGA在分布式事务处理中的应用各有优缺点。两阶段提交适用于需要强一致性、短时间事务的场景,而SAGA则适用于需要高可用性和长时间运行的复杂事务场景。选择合适的事务处理协议需要根据具体需求和系统特性进行权衡。

无论是2PC还是SAGA,了解它们的工作原理、优缺点及其应用场景,都是设计高可用性和高一致性分布式系统的关键。

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

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

相关文章

小程序20-样式:自适应尺寸单位 rpx

手机设备的宽度逐渐多元化,也就需要开发者开发过程中,去适配不同屏幕宽度的手机,为了解决屏幕适配问题,微信小程序推出了 rpx 单位 rpx:小程序新增的自适应单位,可以根据不同设备的屏幕宽度进行自适应缩放 …

unity3d————Resources异步加载

知识点一:Resources异步加载是什么? 在Unity中,资源加载可以分为同步加载和异步加载两种方式。同步加载会在主线程中直接进行,如果加载的资源过大,可能会导致程序卡顿,因为从硬盘读取数据到内存并进行处理…

C#/WinForm拖拽文件上传

一、首先创建一个上传文件的类,继承Control类,如下: public class UploadControl : Control{private Image _image;public UploadControl(){this.SetStyle(ControlStyles.UserPaint | //控件自行绘制,而不使用操作系统的绘制Cont…

2024 同一个网段,反弹shell四种方法【linux版本】bash、python、nc、villian反弹shell图解步骤

实验环境准备(同一个网段下,我是桥接的虚拟机) 一、bash反弹shell 二、python反弹shell 三、nc反弹shell 四、villain反弹shell 实验环境准备(同一个网段下,我是桥接的虚拟机) 一台kali的linux(攻击者)…

FPGA使用Verilog实现CAN通信

FPGA实现CAN通信(Verilog) 1.作者使用的方法是通过FPGA芯片(如Xilinx公司的型号为XC7K325TFFG676-2)控制SJA1000T芯片(CAN控制器芯片)实现CAN通信,如下图所示: 2.熟悉连接方式之后&…

已解决:spark代码中sqlContext.createDataframe空指针异常

这段代码是使用local模式运行spark代码。但是在获取了spark.sqlContext之后,用sqlContext将rdd算子转换为Dataframe的时候报错空指针异常 Exception in thread "main" org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: java.lang.Nu…

jenkins用户在执行scp的时候如何做免密登录

一、背景 在jenkins job中执行scp的shell命令,当然不希望每次输入密码,另外处于出于安全考虑,也不建议在scp命令中指定。 所以,我们需要对远程机器进行免密登录。 本文遇到的问题是,在jenkins机器上执行scp已做到了…

HarmonyOS ArkUI(基于ArkTS) 开发布局 (中)

HarmonyOS ArkUI(基于ArkTS) 开发布局 (上) 四 层叠布局 (Stack) 层叠布局(StackLayout)用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠&…

无线网络信号 6G、5G和2.4G 的一些小科普

无线网络信号划分为6G、5G和2.4G这几类信号,它们各自有不同的用途和区别: 1、 2.4G无线技术 - 用途:2.4G无线技术广泛应用于智能家居、物联网、WLAN和蓝牙设备等。它是一个全球性的工作频段,适用于低速率的应用,如普通…

什么是GCP kunernetes的Node Taints and Tolerations

在Kubernetes中,Node taints和Pod tolerations是两个相关的功能,它们用于控制Pods的调度,以确保Pods不会调度到不适当的节点上。以下是这两个概念的详细解释: Node Taints(节点污点) 定义:Node…

ROS进阶:使用URDF和Xacro构建差速轮式机器人模型

前言 本篇文章介绍的是ROS高效进阶内容,使用URDF 语言(xml格式)做一个差速轮式机器人模型,并使用URDF的增强版xacro,对机器人模型文件进行二次优化。 差速轮式机器人:两轮差速底盘由两个动力轮位于底盘左…

【Playwright + Python】系列(十)利用 Playwright 完美处理 Dialogs 对话框

哈喽,大家好,我是六哥!今天我来给大家分享一下如何使用playwight处理Dialogs对话框,面向对象为功能测试及零基础小白,这里我尽量用大白话的方式举例讲解,力求所有人都能看懂,建议大家先收藏&…

控制器ThinkPHP6

五、控制器中对数组值的返回 在做接口服务时,很多时候回使用数组作为返回值,那么数组如何返回成 json呢? 在 tp6 中返回json 很简单,直接使用 json 进行返回即可,例如: public function index(){$resarra…

基于Java Springboot城市交通管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数…

Ubuntu24.04挂载磁盘

一、引言 由于几块磁盘每次开机时的编号都不一样,造成了很多麻烦,所有重新挂载磁盘试一试。 参考链接: ubuntu挂载磁盘或U盘Ubuntu添加新硬盘,挂载到根目录下的某个文件中 二、挂载磁盘 1. 查看盘名 sudo fdisk -l sda 代表第…

springboot003基于springboot的图书个性化推荐系统(源码+包运行+LW+技术指导)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

【React】状态管理之Zustand

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 状态管理之Zustand引言1. Zustand 的核心特点1.1 简单直观的 API1.2 无需 Provi…

【从零开始的LeetCode-算法】3210. 找出加密后的字符串

给你一个字符串 s 和一个整数 k。请你使用以下算法加密字符串: 对于字符串 s 中的每个字符 c,用字符串中 c 后面的第 k 个字符替换 c(以循环方式)。 返回加密后的字符串。 示例 1: 输入: s "dart&…

Vue的局部使用

文章目录 什么是Vue?局部使用Vue快速入门 常用指令v-forv-bindv-if & v-showv-onv-model Vue生命周期 Axios案例 什么是Vue? Vue是一款构建用户界面的渐进式的JavaScript框架. 局部使用Vue 快速入门常用指令声明周期 快速入门 准备: 准备html页面,并引入Vue模块(…

二分查找法(leetcode 704)

在一个数组里找一个target&#xff0c;判断这个target在不在这个数组里&#xff0c;如果在&#xff0c;返回这个数组所对应的这个元素所对应的下标&#xff0c;否则返回-1. 易错点&#xff1a; &#xff08;1&#xff09;while(left<right) vs while(left<…