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

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

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

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

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

如何用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年,是一家以从事医药制造业为主的企业。用户在日常工作运营中涉及到次氯酸钠、乙醇消毒剂、甲…

面试算法-76-最接近的三数之和

题目 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1: 输入:nums [-1,2,1,-4], target 1 输出&#…

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

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

蓝桥杯2021年第十三届省赛真题-纪念日

一、题目 纪念日 2020 年 7 月 1 日是中国共产党成立 99 周年纪念日。中国共产党成立于 1921 年 7 月 23 日。请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包 含多少分钟&#xff1f;填空题 二、分析 法一&#xff1a; 借助计算机算出有多少天&am…

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

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

继承和深拷贝封装

继承和深拷贝封装 今日目标&#xff1a; 1.es5寄生组合式继承 2.es6类的继承 3.深拷贝函数封装 00-回顾 # 不同数据类型赋值时的区别&#xff1a; 基本数据类型&#xff0c;赋的就是值&#xff0c;相互之间不再有任何影响 引用数据类型&#xff0c;赋的是地址&#xff0c…

LeetCode 每日一题 2024/3/18-2024/3/24

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 3/18 303. 区域和检索 - 数组不可变3/19 1793. 好子数组的最大分数3/20 1969. 数组元素的最小非零乘积3/21 2671. 频率跟踪器3/22 2617. 网格图中最少访问的格子数3/23 254…

OpenJudge - 02:找第一个只出现一次的字符

总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个只包含小写字母的字符串&#xff0c;请你找到第一个仅出现一次的字符。如果没有&#xff0c;输出no。 输入 一个字符串&#xff0c;长度小于100000。 输出 输出第一个仅出现一次的字符&#xff0c;若没有则输出no。 样例输…

LeetCode-热题100:22. 括号生成

题目描述 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a; n 3 输出&#xff1a; [“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 示例 2&#xff1a;…

python内置函数 S

python内置函数 S Python 解释器内置了很多函数和类型&#xff0c;任何时候都能使用。 S 名称描述set创建一个集合。setattr设置对象的属性值。slice创建切片对象。sorted对可迭代对象&#xff08;如列表、元组等&#xff09;进行排序&#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…

linux修改ftp上传路径

命令行三行即可&#xff0c;假如我想把上传的视频配置到nginx的文件目录下&#xff0c; #修改指定用户的指定文件目录 usermod -d /home/nginx/www/images ftpuser # #给权限 chown -R ftpuser:ftpuser /home/nginx/www/images #重启 systemctl restart vsftpd.service顺便…

洛谷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 模块关…

ubuntu安装可调试的ffmpeg

安装相关库 # 安装gcc等编译工具链的相关包 sudo apt install g++ nasm yasm pkg-config # SDL2库 sudo apt-get install libsdl2-2.0 libsdl2-dev # 编解码相关库和工具 sudo apt install libx264-dev libx265-dev libdc1394-22-dev libv4l-dev libmp3lame-dev 1、下载ffmpeg源…

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

&#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、环境适配 适配英文 适配中文…