一文打尽分布式系统中的事务处理!

之前分享了分布式事务的实现方案,今天我们来对比总结一下:

如何使用最大努力通知实现分布式事务?与本地消息表区别?

如何通过本地消息表实现分布式事务

用二阶段三阶段提交实现分布式事务

如何用TCC实现分布式事务?

使用RocketMQ实现分布式事务

如何用saga实现分布式事务?

使用Seata实现分布式事务真香!

概述

在构建现代分布式系统时,维持跨多个服务的数据一致性是一项艰巨的任务。想象一下,你正在在线商城上购物,准备为GDP贡献自己的一份力量。在你按下“提交”按钮的那一刻,幕后发生了什么?系统需要同时完成两项操作:在库存服务中减少商品数量和在订单服务中创建订单记录。在单体架构中,这些操作会在同一个事务内完成,但分布式系统中的复杂性远远超出这个范围。

深入理解ACID与CAP

在传统的数据库事务领域,我们依赖ACID来确保数据的完整性和一致性。

ACID特性解释
原子性(Atomicity)事务中的所有操作要么全部成功执行,要么全部失败回滚,就像是一个不可分割的“原子”单位。一旦事务开始,就保证其中的操作要么全部完成,要么一个也不做。
一致性(Consistency)事务必须保证数据库从一个一致性状态转移到另一个一致性状态。事务执行前后,所有数据库的规则都必须应用,保证数据库数据的正确性和逻辑一致性。
隔离性(Isolation)并发执行的事务之间不应该互相影响。每个事务都像是在一个隔离的环境中执行,它的执行不会被其他事务干扰,同样也不会干扰到其他事务。
持久性(Durability)一旦事务提交,它对数据库的改变就应该是永久的。即使发生故障,数据库也应该能够恢复到事务提交时的状态。

然而,当这些概念应用到分布式系统时,我们需要重新思考它们的含义。这就是CAP理论登场的时刻:在分布式系统中,我们不可能同时实现一致性(C)、可用性(A)和分区容错性(P)。

CAP告诉我们,在分布式系统中,不可能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)。具体来说:

  • • 一致性(Consistency):在任何分布式节点读取的数据都是一样的。

  • • 可用性(Availability):每个请求总能在有限时间内得到响应,不保证获取的数据为最新。

  • • 分区容错性(Partition tolerance):系统部分节点无法通信的情况下,其余节点形成“网络分区”时也能继续提供服务。

在分布式系统中,网络分区是无法避免的。因此,系统设计通常需要在一致性和可用性之间做出选择(AP或者CP)。这个选择直接关系到分布式事务的处理方式,因为事务机制需要确保跨多个节点的操作一致性,同时也希望系统能对外提供高可用服务。

完全遵循CP可能会导致可用性的损失。这就引出了BASE理论,它强调基本可用性、软状态和最终一致性,为分布式系统提供了另一种思考数据一致性的方式

BASE理论提出了一种与CAP理论不同的权衡方法。它更侧重于可用性,允许数据在分布式系统的不同节点间存在一定程度的不一致,但最终会达到一致状态。当应用ACID属性到分布式系统时,我们通常遵循BASE原则,即基本可用(Basically Available)、软状态(Soft state)和最终一致性(Eventually consistent)。

解决方案

基于CAP及BASE理论,有多种策略可以帮助我们实现不同级别的数据一致性:

  • 刚性事务:基于CP,遵循ACID,对数据要求强一致性。

    • XA协议:基于数据库层面的分布式事务协议,主要分为两阶段、三阶段。主流的诸如Oracle、MySQL等数据库均已实现了XA接口

  • 柔性事务:基于AP,遵循BASE,允许一定时间内不同节点的数据不一致,但要求最终一致。

    • 最大努力通知:最大努力通知它在事务主动方增加了消息校对的接口,如果事务被动方没有接收到消息,此时可以调用事务主动方提供的消息校对的接口主动获取。

    • 本地消息表:本地消息表的方案最初是由 eBay 提出,核心思路是将分布式事务拆分成本地事务进行处理。

    • 可靠消息:基于 MQ 的分布式事务方案其实是对本地消息表的封装,先发送一个半消息,本地事务执行后再进行确认。

    • TCC: TCC(Try-Confirm-Cancel)又被称补偿事务,TCC与2PC的思想很相似,但2PC是应用于在数据库层面,TCC则在应用层面的,需要我们编写业务逻辑来实现。

    • SAGA:Saga是由一系列的本地事务构成。每一个本地事务在更新完数据库之后,会发布一条消息或者一个事件来触发Saga中的下一个本地事务的执行。如果一个本地事务因为某些异常失败,Saga会反向执行这个失败的事务之前成功提交的所有事务的补偿操作。

我们通过一张图来详细对比下:

图片

总结

方案概述使用场景
XA事务依据两阶段、三阶段提交协议进行分布式事务管理需要强一致性的场景,如金融系统
最大努力通知不保证ACID特性,尽力而为对一致性要求不高,但要求高可用性的场景
本地消息表结合数据库记录表,通过记录表保证操作和消息发送的原子性异步确保操作和消息一致性的场景
TCC业务上分为Try, Confirm/Cancel两个阶段,先预占资源再确认 。业务上保障对一致性要求高,可明确定义补偿操作的场景
SAGA将长事务拆分为一系列小事务,处理失败通过补偿事务反向回滚长事务处理,尤其是微服务架构下的业务流程处理
可靠消息(RocketMQ)通过消息服务保证分布式事务的最终一致性,先发送一个半消息,本地事务执行后再进行确认需要保证消息不丢失并最终处理的异步通信场景
Seata阿里的分布式统一解决方案,通过TC、TM、RM组件协调分布式事务各分支,支持AT、TCC、SAGA、XA模式支持多种分布式事务场景,适用于大多数微服务架构

通过深入学习这些概念和解决方案,我们不仅了解了分布式事务的复杂性,还学会了如何在实际应用中做出恰当的技术选择。那么遇到不同的业务述求时你知道该如何选择合适的分布式事务处理方法了吗?

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

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

相关文章

上海晋名室外危化品暂存柜助力医药制造行业安全

近日上海晋名又有两台室外危化品暂存柜项目通过验收,此次项目主要用于医药制造行业次氯酸钠、乙醇消毒剂、甲醛等化学品的室外暂存安全。 用户单位创立于2003年,是一家以从事医药制造业为主的企业。用户在日常工作运营中涉及到次氯酸钠、乙醇消毒剂、甲…

MT2191 整数大小比较(高精度)

给出两个正整数&#xff0c;判断他们的大小。 输入格式&#xff1a; 两个正整数。 输出格式&#xff1a; 若前者大&#xff0c;输出>&#xff1b; 若后者大&#xff0c;输出<&#xff1b; 若一样大&#xff0c;输出。 输入&#xff1a; 1412894619244619891 23762842…

Matlab|基于条件风险价值CVaR的微网动态定价与调度策略

目录 1 主要内容 模型示意图 电能交易流程 模型亮点 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序复现文章《A cooperative Stackelberg game based energy management considering price discrimination and risk assessment》&#xff0c;建立基于主从博弈的考虑…

面试算法-78-两两交换链表中的节点

题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff…

Filter介绍使用案例

文章目录 一、Filter概念二、Filter快速入门定义类&#xff0c;实现Filter接口&#xff0c;并重写其所有方法 三、Filter执行流程四、Filter使用细节1、Filter拦截路径配置2、过滤器链 五、案例 一、Filter概念 二、Filter快速入门 定义类&#xff0c;实现Filter接口&#xff0…

paddlepaddle框架构建数据集进行分类问题的时候,会发现数据集在构建的过程中不会构建标签(花分类)

问题描述 在做一个paddlepaddle项目的时候&#xff0c;需要使用神经网络对他进行分类&#xff0c;数据集的结构如下图&#xff0c;这时候我们可以使用常用dataset方法对数据集进行构建。 这时候我们就会发现一个问题&#xff0c;就是这个矿建不是构建标签&#xff0c;也就是说…

数据格式化方法

首先你需要一个可以展示代码的组件&#xff1b; 我使用的是tech-ui(内部组件库)&#xff1b; 你如果没有类似的组件&#xff0c;可以参考以下链接替代&#xff1a; react-monaco-editor -- 代码编辑器(适用Umi)_umi monaco editor-CSDN博客 Codemirror -- 代码编辑器(react…

洛谷B3626 跳跃机器人

#先看题目 题目描述 地上有一排格子&#xff0c;共 n 个位置。机器猫站在第一个格子上&#xff0c;需要取第n 个格子里的东西。 机器猫当然不愿意自己跑过去&#xff0c;所以机器猫从口袋里掏出了一个机器人&#xff01;这个机器人的行动遵循下面的规则&#xff1a; 初始时…

【项目设计】仿 muduo 库实现 OneThreadOneEventLoop 式并发服务器

文章目录 一、项目介绍1. 项目简介2. 开发环境3. 核心技术4. 开发阶段 二、前置知识了解1. reactor2. timerfd3. timerwheel4. eventfd5. regex6. any 三、框架设计1. 项目模块划分1.1 SERVER 模块1.2 协议模块 2. 项目模块关系图2.1 Connection 模块关系图2.2 Acceptor 模块关…

滑动窗口:流量控制的有效手段

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

HarmonyOS系统开发ArkTS常用组件文本及参数(五)

目录 一、Text组件 1、Text组件案例 二、Text组件参数 1、string字符串类型 2、Resources类型 2.1、resources中内容配置 base/element/string.json 中的内容 zh_US/element/string.json 中的内容 es_US/element/string.json 中的内容 2.2、环境适配 适配英文 适配中文…

【Bug】记录2024年遇到的Bug以及修复方案

--------------------------------------------------------分割线 2024.3.22------------------------------------------------------- 1、load_sample_image raise AttributeError(“Cannot find sample image: %s” % image_name) AttributeError: Cannot find sample ima…

Linux--Ubuntu安装【保姆级教程】

Linux操作系统时程序员必须要学的操作系统。接下来我们就来看一下Linux操作系统是如何安装的 我们在 Vmware 虚拟机中安装 linux 系统&#xff0c;所以需要先安装 vmware 软件&#xff0c;然后再 安装 Linux 系统。 一.所需安装文件&#xff1a; Vmware 下载地址(现在最新版的…

springboot+vue考试管理系统

基于springboot和vue的考试管理系统 001 springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的在线考试管理系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

【JS】for in可能遇到的问题

问题一&#xff1a;for in 打印属性顺序与定义顺序不一致 先来做一道题&#xff0c;请说出打印结果 const obj {a2: aaa,2: aaa,1: aaaa,a1: aaa, }for(let key in obj){console.log(key) }结果&#xff1a; 1 2 a2 a1 属性的书写顺序不一定就是对象遍历时的顺序。这涉及到…

【2】华为交换机如何修改Web登录密码?

0x01 问题描述 如果忘记了Web登录密码或者希望修改Web登录密码&#xff0c;用户可以通过Console口、STelnet或Tenet等方式登录交换机后设置新的Web登录密码。 使用Telnet协议存在安全风险&#xff0c;建议使用Console囗或STelnet V2登录设备 0x02 问题解决 <HUAWEI> s…

前端应用开发实验:条件渲染和循环渲染

目录 实验目的相关知识点实验内容图片的隐藏和显示代码实现效果 电影票房排序代码实现效果 代办事项记录代码实现效果 实验目的 (1)熟练掌握v-on 指令的用法&#xff0c;学会使用v-on 指令监听DOM元素的事件&#xff0c;并通过该事件触发调用事件处理程序。 (2)掌握v-on指令修…

算法---排序

目录 插入排序插入排序的思想代码实现 冒泡排序冒泡排序的思想代码实现 堆排序堆排序的基本思想代码实现 希尔排序希尔排序基本思想代码实现 选择排序选择排序基本思想代码展示 总结 插入排序 插入排序的思想 简单来说&#xff0c;插入排序就时将一个数插入一个数插入一个有序…

使用 ReclaiMe Pro 查找并恢复网络中的 SSH 服务器数据

天津鸿萌科贸发展有限公司是 ReclaiMe Pro 数据恢复软件的授权代理商。ReclaiMe Pro 数据恢复软件专注于恢复几乎所有文件系统及各种类型和复杂程度的 RAID 阵列。 在本文中&#xff0c;我们介绍 ReclaiMe Pro 对于采用 SSH 连接方式的网络服务器中数据的恢复方法。 ReclaiMe…

设计模式及其在项目、框架中的应用

设计模式的作用&#xff1a; 1、类之间关系图&#xff0c;明确的角色及其关系、作用&#xff1b; 2、符合开闭原则&#xff0c;职责明确&#xff0c;并且开放的拓展点可以有效应对后期的变化。 &#xff08;一&#xff09;、责任链模式 适用场景&#xff1a; 在一个流程中&…