C++面试 -分布式架构-架构能力:分布式事务的学习

       

目录

1. 分布式事务的基本概念

2. 分布式事务的需求背景

3. 分布式事务的实现方式

1. 两阶段提交(2PC)

2. 三阶段提交(3PC)

3. 补偿事务(Saga)

4. 分布式事务协调器

4. 分布式事务的挑战

5. 面试准备建议


        分布式事务是分布式系统中保证数据一致性和完整性的一种机制。在多个独立的数据库或服务中进行操作时,分布式事务确保所有操作要么全部成功,要么全部失败。这对于构建可靠的分布式应用至关重要。在面试中,理解分布式事务的基本概念、类型、实现方式和挑战是非常重要的。下面详细介绍分布式事务的关键点。

1. 分布式事务的基本概念

        分布式事务是在不同的数据库、系统或网络分区中进行的事务,需要跨多个数据存储系统保持数据的一致性。与传统的单体事务相比,分布式事务管理更加复杂,因为它需要协调和管理跨越不同系统的操作。

2. 分布式事务的需求背景

  • 系统间的数据一致性:在微服务架构或分布式系统中,不同服务可能使用独立的数据库,分布式事务确保跨服务的操作一致。
  • 业务流程的完整性:某些业务流程可能涉及多个服务的操作,分布式事务保证这些操作要么全部成功,要么全部回滚。

        以一个电商平台为例,这个平台由多个微服务构成,包括用户服务、订单服务、库存服务和支付服务,每个服务都可能使用独立的数据库。在这样的系统中,一个典型的业务流程如用户下单购买商品,涉及到以下几个步骤,展现了分布式事务对系统间数据一致性和业务流程完整性的需求:

  1. 用户下单:用户在电商平台上下单购买商品。此操作涉及用户服务(减少用户余额)、订单服务(创建新订单)和库存服务(减少商品库存)。

  2. 检查库存:在订单服务创建订单前,需要调用库存服务确认商品库存足够。

  3. 支付处理:用户服务需要处理用户的支付请求,扣减用户账户中的余额。

  4. 更新库存:支付成功后,库存服务需要更新商品的库存量,减去用户购买的数量。

  5. 确认订单:最后,订单服务确认订单状态更新为已支付。

        在这个过程中,如果任何一个步骤失败(例如,库存不足、支付失败等),整个购买过程需要回滚。例如:

  • 如果用户支付后,发现库存服务更新失败(可能是因为商品已被其他用户购买完),则需要取消这次操作,包括退款给用户、恢复库存数量和取消订单。
  • 这意味着用户的余额需要恢复,库存数量不变,订单状态更新为取消,确保系统的数据一致性和业务流程的完整性。

        在没有分布式事务管理的情况下,实现这种复杂业务流程的数据一致性和完整性是非常困难的。分布式事务通过跨服务的操作协调,确保了即使在服务调用失败或网络问题的情况下,也能保持整个系统的一致性和业务流程的原子性。这个例子清晰地展示了分布式事务在维护微服务架构中的数据一致性和业务流程完整性方面的关键作用。

3. 分布式事务的实现方式

        分布式事务的实现通常基于以下几种模型:

  • 两阶段提交(2PC):是分布式事务的经典实现方式,分为准备阶段和提交阶段,确保所有参与者都同意提交事务。
  • 三阶段提交(3PC):在两阶段提交的基础上增加了一个预提交阶段,以减少阻塞和提高系统的可用性。
  • 补偿事务(Saga):通过一系列本地事务和补偿操作来管理分布式事务,适用于长事务和微服务架构。
  • 分布式事务协调器:如XA协议、TCC(Try-Confirm/Cancel)模式,这些协调器帮助管理分布式事务的不同阶段。

        让我们深入了解这些分布式事务的实现方式,以及它们的工作原理和适用场景。

1. 两阶段提交(2PC)

        两阶段提交是分布式事务中最常见的一种实现方式,它包含两个阶段:准备阶段和提交阶段。

  • 准备阶段:事务协调器(通常是一个中心节点)询问所有参与事务的节点(或称为参与者),是否准备好提交事务。如果所有参与者都回答“是”,则进入下一阶段;如果任何一个参与者回答“否”,则事务将被回滚。
  • 提交阶段:事务协调器根据第一阶段的回应,决定是让所有参与者提交事务,还是回滚事务。所有参与者都将遵循协调器的决定。

        2PC保证了事务的原子性和一致性,但其缺点是性能开销较大,特别是在高延迟网络环境下,事务锁定资源的时间较长,影响系统吞吐量。

2. 三阶段提交(3PC)

        三阶段提交是对两阶段提交的改进,增加了一个预提交阶段,目的是减少阻塞时间,提高系统的可用性和容错性。3PC的阶段包括:

  • 预准备阶段:事务协调器向所有参与者询问是否可以执行事务,并收集回应。
  • 准备阶段:一旦所有参与者同意,协调器将进入准备阶段,参与者开始准备数据,锁定资源。
  • 提交/回滚阶段:根据前两个阶段的结果,协调器决定是提交还是回滚事务,并通知所有参与者执行相应操作。

        3PC通过引入预准备阶段,提高了系统对节点故障的容忍度,但相比2PC,它引入了更多的消息交换,可能会影响系统性能。

3. 补偿事务(Saga)

        Saga是一种管理长期事务的方法,特别适用于微服务架构。它不是通过锁定资源来实现一致性,而是通过一系列本地事务和补偿操作(回滚操作)来维持系统的一致性。

  • 操作序列:一个Saga包含一系列事务,这些事务分布在不同的服务中。
  • 补偿操作:如果某个事务失败,将执行之前成功事务的补偿操作来回滚整个Saga,保证系统一致性。

        Saga模式适用于长事务和需要高度可用性的分布式系统,但设计和实现补偿逻辑可能比较复杂。

4. 分布式事务协调器

        如XA协议和TCC(Try-Confirm/Cancel)模式等,是专门设计来管理分布式事务的协调器。

  • XA协议:是一个两阶段提交的标准,由事务管理器(TM)和资源管理器(RM)组成,广泛支持在数据库和消息队列中。
  • TCC模式:分为尝试(Try)、确认(Confirm)、取消(Cancel)三个阶段。在Try阶段预留资源,在Confirm阶段执行事务,在Cancel阶段执行回滚。TCC模式更加灵活,适用于业务逻辑较为复杂的场景。

        每种实现方式都有其优点和局限性,选择合适的分布式事务方案需要根据具体的业务需求、系统架构和性能要求来决定。

4. 分布式事务的挑战

  • 性能问题:分布式事务的协调和管理增加了系统的复杂性,可能影响系统的响应时间和吞吐量。
  • 数据一致性:在分布式系统中保持数据一致性是一个挑战,尤其是在网络分区或服务故障的情况下。
  • 系统依赖性:分布式事务的实现可能依赖于特定的技术栈或中间件,这可能限制系统的灵活性和可移植性。

5. 面试准备建议

  • 理解不同分布式事务模型的优缺点:准备分析2PC、3PC、Saga等模型的工作原理及其适用场景。
  • 实践经验:如果有机会,尝试在项目中实践分布式事务的应用,了解其在实际环境中的表现和挑战。
  • 关注最新技术:了解新兴的分布式事务处理技术和框架,例如区块链技术在分布式事务管理中的应用。

        准备分布式事务的面试时,重点是理解其核心概念、实现机制和面临的主要挑战。通过结合理论知识和实践经验,你将能够更好地向面试官展示你对分布式事务的深入理解。

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

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

相关文章

QEMU之内存虚拟化

内存虚拟化方案 最直观的方案,将QEMU进程的虚拟地址空间的一部分作为虚拟机的物理地址。但该方案有一个问题: 在物理机上,CPU对内存的访问在保护模式下是通过分段分页实现的,在该模式下,CPU访问时使用的是虚拟地址&am…

Unity绘制六边形体

现在steam上面有很多下棋类/经营类的游戏都是用六边形的地形,比较美观而且实用,去年在版本末期我也自己尝试做了一个绘制六边体的demo,一年没接触unity竟然都要忘光了,赶紧在这边记录一下。 想cv代码可以直接拉到代码章节 功能 …

音频转换器哪个好?3款电脑软件+3款手机应用

在当今的数字时代,音频转换已成为许多用户日常的需求。为了帮助您找到最佳的音频转换工具,我们将介绍3款电脑软件和3款手机应用。这些工具都各有特点,能够满足不同用户的需求。 1.电脑软件篇 1.1金舟音频大师 金舟音频大师是一款多功能的音…

提取天猫店铺商家电话的爬虫软件

在日常生活中,我们经常会遇到需要获取商家电话的情况,比如想要咨询商品信息、预约服务等。而天猫作为国内知名的电商平台,拥有众多的商家店铺,如果能够快速提取店铺商家电话,就能够方便我们与商家进行沟通。 为了实现…

【LabVIEW 】串口如何读取长度不一致的字符串

工程经验 1、在循环中,加入定时器,这样可以一段时间读取一次。 2、只要获取完整的一帧数据,就可以进行过滤筛选。

力扣128. 最长连续序列(哈希表)

Problem: 128. 最长连续序列 文章目录 题目描述思路复杂度Code 题目描述 思路 1.先将数组中的元素存入到一个set集合中(去除重复的元素) 2.欲找出最长连续序列(先定义两个int变量longestSequence和currentSequence用于记录最长连续序列和当前…

Adobe Acrobat DC中如何合并pdf并生成目录

一、利用 Acrobat 合成pdf目录 (一)新建标签(更改标签等级等) 1,用Adobe acrobat 软件打开待添加书签的pdf文档。 2,打开之后点击软件左边栏的书签(有时被隐藏了,点击一下界面左边…

企业服务器有哪些作用?

企业服务器是企业信息系统的核心组成部分,能够提高企业的工作效率,那么企业服务器具体都有哪些作用呢? 企业服务器的作用主要有以下几个方面: 企业服务器有着虚拟化技术,可以将一台物理服务器分为多个虚拟服务器&#…

第一节 数据操作+数据处理

本系列文章为李沐老师《动手学深度学习》Pytorch版实践学习笔记,相关课程教学、书籍、代码均为开源,可通过以下链接参考学习: 跟李沐学AI的个人空间-跟李沐学AI个人主页-哔哩哔哩视频 (bilibili.com) 前言 — 动手学深度学习 2.0.0 documenta…

高校物品捐赠管理系统|基于springboot高校物品捐赠管理系统设计与实现(源码+数据库+文档)

高校物品捐赠管理系统目录 目录 基于springboot高校物品捐赠管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、捐赠信息管理 3、论坛信息管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算…

RabbitMQ讲解与整合

RabbitMq安装 类型概念 租户 RabbitMQ 中有一个概念叫做多租户,每一个 RabbitMQ 服务器都能创建出许多虚拟的消息服务器,这些虚拟的消息服务器就是我们所说的虚拟主机(virtual host),一般简称为 vhost。 每一个 vhos…

NLP-词向量、Word2vec

Word2vec Skip-gram算法的核心部分 我们做什么来计算一个词在中心词的上下文中出现的概率? 似然函数 词已知,它的上下文单词的概率 相乘。 然后所有中心词的这个相乘数 再全部相乘,希望得到最大。 目标函数(代价函数&#xff0…

如何用CDH+Apache DolphinScheduler开启Kerberos

搭建环境 多台linux主机搭建集群CDH 6.3.2 (Parcel)版本Apache DolphinScheduler1.3.2版本,本流程在CDH已搭建完成并可正常使用后,开启kerberos功能,Apache DolphinScheduler用于大数据任务管理与执行,是很不错的任务调度平台&am…

ZYNQ--MIG核配置

文章目录 MIG核配置界面多通道AXI读写DDR3MIG核配置界面 Clock Period: DDR3 芯片运行时钟周期,这个参数的范围和 FPGA 的芯片类型以及具体类型的速度等级有关。本实验选择 1250ps,对应 800M,这是本次实验所采用芯片可选的最大频率。注意这个时钟是 MIG IP 核产生,并输出给…

压缩视频大小的软件有哪些?5款软件推荐

压缩视频大小的软件有哪些?随着高清摄像设备的普及和网络速度的不断提升,视频文件变得越来越庞大,动辄数百兆甚至数GB的大小常常让用户在分享和存储时感到头疼。幸运的是,市面上有许多优秀的视频压缩软件可以帮助我们轻松应对这一…

GPTs - 定制版的ChatGPT

GPTs指的是定制版的ChatGPT (Custom versions of ChatGPT),它试图解决为不同用途定制ChatGPT的需求。为了实现这一点, GPTs 提供了指令 (Instructions),知识 (Knowledge),能力 (Capabilities),动作 (Actions) 等功能&…

Docker的简单介绍以及常用命令介绍

目录 一、Docker的简介 二、Docker安装 环境配置 阿里云镜像仓库配置 三、Docker常用命令 3.1 基本命令 3.2 镜像命令 3.3 容器命令 一、Docker的简介 Docker是一个被广泛使用的开源容器引擎,是一种操作系统级别的虚拟化技术,它以一种特殊进程的…

vue 移动端app预览和保存pdf踩坑

需求 使用Vue开发h5,嵌套到Android和IOS的Webview里,需要实现pdf预览和保存功能,预览pdf的功能,我这边使用了三个库,pdf5,pdf.js,vue.pdf,现在把这三个库在app端的坑分享一下。先说…

NFS服务器挂载失败问题

问题 mount.nfs: requested NFS version or transport protocol is not supported背景:现在做嵌入式开发,需要在板端挂载服务器,读取服务器文件。挂载中遇到该问题。 挂载命令长这样 mount -t nfs -o nolock (XXX.IP):/mnt/disk1/zixi01.ch…

c++学习:类

C 中的类(class)是一种编程结构,用于创建对象。 这些对象可以拥有属性(即数据成员)和行为 (即成员函数或方法)。 类的概念是面向对象编程的核心之一,其主要目的是将数据和与数据相…