《凤凰架构》 -分布式事务章节 读书笔记

分布式事务严谨的定义:分布式环境下的事务处理机制

CAP定理:在一个分布式系统中,涉及共享数据问题时,以下三个特性最多只能同时满足两个

        一致性:代表数据在任何时刻、任何分布式节点中看到的都是符合预期的,一致性概念在分布式研究中是有严肃定义和多种细分类型的概念(与分布式共识算法中的面向副本复制的一致性不同,此处指的是面向数据库状态的一致性)。

        可用性:代表系统不间断的提供服务的能力,与其密切相关的两个指标为可用性和可维护性。可靠性使用平均无故障时间来度量,可维护性用平均可修复时间来度量

        分区容忍性:代表分布式环境中部分节点因为网络原因而彼此失联后,即与其他节点形成“网络分区时”,系统仍能正确地提供服务的能力。

选择放弃一致性的AP系统是目前设计分布式系统的主流选择,因为:

        1、P是分布式网络的天然属性(永远可靠的通信在分布式系统中必定不成立,这不是设计者想不想的问题,而是只要用到网络来共享数据,分区现象就会始终存在),目前条件下,无论如何设计也无法避免P的出现

        2、A是建设分布式系统的目的,如果可用性随着节点数量增加反而降低的话,很多分布式系统就失去了价值。除非是银行、证券这些涉及金钱交易的服务,宁可中断也不能出错,否则多数系统是不能容忍节点越多可用性反而越低的。

需要注意的是CAP和ACID理论中的一致性称为强一致性或者在线一致性。无论如何,我们建设信息系统终究还是要确保操作结果至少在最终交付的时候是正确的(解读:允许数据在中间过程中出错(不一致), 但应该在输出时被修正过来)。因此在牺牲了C的AP系统中,要尽可能地获得正确的结果的行为称为追求“弱一致性”。在强一致性和弱一致性之间还存在着最终一致性:如果数据在一段时间内没有被另外的操作所更改,那么它最终会达到与强一致性过程相同的结果。面向最终一致性的算法也被称为“乐观复制算法”。

TCC分布式事务机制:TCC由“try-confirm-cancel”三个单词缩写而成。如同TCC名字所示,它分为如下三个过程:

        1、Try:尝试执行阶段,完成所有业务可执行性的检查(保障一致性),并且预留好全部需要用到的业务资源(保障隔离性);

        2、Confirm阶段:确认执行阶段,不进行任何业务检查,直接使用Try阶段准备的资源来完成业务处理。Confirm阶段可能会重复执行(失败重试导致的),因此本阶段所执行的操作需要具备幂等性(即多次执行结果和执行一次的结果相同)

        3、Cancel阶段:取消执行阶段,释放Try阶段预留的业务资源。Cancel阶段也可能会重复执行,因此也需要满足幂等性

TCC其实有点类似于2PC的准备阶段和提交阶段,但是TCC位于用户代码层面(即业务代码,写业务代码的程序员相对于基础库而言都是用户),而不是基础设施层面。

TCC业务侵入性和开发成本都很高,所以一般我们不会完全靠裸编码实现TCC,而是会借助一些分布式事务中间件去完成,尽可能地减轻编码工作量。

SAGA事务:TCC事务是常见柔性事务中性能最高的,但是它并不能满足所有场景,因此有了SAGA事务。SAGA事务的设计思路:把一个大事务分解,目的是为了避免大事务长时间锁定数据库的资源。 SAGA由两部分操作组成:

        1、大事务拆分成若干个小事务,整个分布式事务T分解成n个子事务,命名为T_1T_2,…,T_i,…,T_n。每个子事务都应该是或者能被视为是原子行为。如果分布式事务能够正常提交,其对数据的影响(最终一致性)应与连续按顺序成功提交 T_i等价。

        2、为每个子事务设计一个对应的补偿动作,命名为C_1,C_2,...C_i,...C_nT_iC_i需要满足如下条件:(1)T_iC_i都具备幂等性;(2)T_iC_i满足交换律,即无论是先执行T_i还是C_i,其效果都是一样的;(3)C_i必须能成功提交,即不考虑C_i本身提交失败回滚的情形,如出现C_i本身提交失败,就必须持续重试直至成功或者人工介入。

如果T_1T_n均成功提交,那么事务顺利完成,否则就需要采用正向恢复策略或者反向恢复策略。

正向恢复(Forward Recovery): 如果事务T_i提交失败,则一直对T_i进行重试直到成功为止(最大努力交付),这种恢复方式不需要补偿,适用于事务最终都要成功的场景,正向恢复的执行模式为:T_1,T_2,...,T_i(失败),T_i(重试),...,T_{i+1},...T_n

反向恢复(Backward Recovery):如果事务T_i提交失败,则一直执行C_iT_i进行补偿,直到成功为止(最大努力交付)。这里要求C_i(可通过持续重试)必须执行成功。反向恢复的执行模式为:T_1,T_2,...T_i(失败),C_i(补偿),...,C_2,C_1

SAGA必须保证所有子事务都得以提交或者补偿,但实际SAGA系统本身也有可能会崩溃,所以他必须被设计成数据库类似的日志机制以保证系统恢复后可以追踪到子事务的执行情况。例如直行道哪一步或者补偿到哪一步了。

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

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

相关文章

HarmonyOS创建一个ArkTS卡片

创建一个ArkTS卡片 在已有的应用工程中,创建ArkTS卡片,具体操作方式如下。 创建卡片。 根据实际业务场景,选择一个卡片模板。 在选择卡片的开发语言类型(Language)时,选择ArkTS选项,然后单…

【LNMP】云导航项目部署及环境搭建(复杂)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、项目介绍1.1项目环境架构LNMP1.2项目代码说明 二、项目环境搭建2.1 Nginx安装2.2 php安装2.3 nginx配置和php配置2.3.1 修改nginx文件2.3.2 修改vim /etc/p…

制造业客户数据安全解决方案(数据防泄密需求分析)

机械行业是历史悠久的工业形式,与国民经济密切相关,属于周期性行业,是我国最重要的工业制造行业之一。即使网络经济与IT信息技术在世界范围内占据主导地位,依然离不开一个发达的、先进的物质基础,而机械行业正是为生成…

【kubernetes】二进制部署k8s集群之,多master节点负载均衡以及高可用(下)

↑↑↑↑接上一篇继续部署↑↑↑↑ 之前已经完成了单master节点的部署,现在需要完成多master节点以及实现k8s集群的高可用 一、完成master02节点的初始化操作 二、在master01节点基础上,完成master02节点部署 步骤一:准备好master节点所需…

Three.js加载PLY文件

这是官方的例子 three.js webgl - PLY 我在Vue3中使用&#xff0c;测试了好久始终不显示点云数据。在网上查询后发现ply文件要放置在public目录下才行 <el-row><el-button type"primary" class"el-btn" click"IniThree1">PLY</…

docker部署seata1.6.0

docker部署seata1.6.0 Seata 是 阿里巴巴 开源的 分布式事务中间件&#xff0c;解决 微服务 场景下面临的分布式事务问题。需要先搭建seata服务端然后与springcloud的集成以实现分布式事务控制的过程 &#xff0c;项目中只需要在远程调用APi服务的方法上使用注解 GlobalTransa…

使用logicflow流程图实例

一.背景 需要使用流程引擎开发项目&#xff0c;没有使用flowable、activiti这类的国外流程引擎&#xff0c;想使用国内的引擎二次开发&#xff0c;缺少单例模式的流程画图程序&#xff0c;都是vue、react、angluer的不适合&#xff0c;从网上找了antx6、logicflow、bpmn.js。感…

架构设计:数据库扩展

引言 随着业务的发展和用户规模的增长&#xff0c;数据库往往会面临着存储容量不足、性能瓶颈等问题。为了解决这些问题&#xff0c;数据库扩展成为了一种常见的解决方案。在数据库扩展的实践中&#xff0c;有许多不同的策略和技术可供选择&#xff0c;其中包括水平拆分、垂直…

【MySQL 探索之旅】初始MySQL数据库

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

【LeetCode每日一题】 单调栈的案例84 柱状图中最大的矩形

84 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释…

Conmi的正确答案——将JAVA中maven的.m2文件夹放到D盘

系统&#xff1a;WIN11 1、将.m2文件夹移动到D盘 移动后&#xff1a; 2、创建目录链接 mklink /j "C:\Users\Administrator\.m2" "D:\.m2"至此&#xff0c;maven默认的jar包会加载到D盘的.m2文件夹

Ubuntu环境安装MySQL数据库

1.安装过程 打开终端&#xff08;Terminal&#xff09;窗口&#xff0c;使用以下命令更新系统软件包&#xff1a; sudo apt update ubuntu环境安装mysql-server和mysql开发包&#xff0c;包括mysql头文件和动态库文件&#xff0c;命令如下&#xff1a; sudo apt-get instal…

vue复用组件出现data-v-xxx乱码无法通过css修改指定样式

vue复用组件出现data-v-xxx乱码无法通过css修改指定样式解决方案如下 选择需要修改的样式 给最高级父级元素定义新的classname 与原有样式保持相同级联 修改指定样式 .demo_parent .demo_son .demo_grandson[data-v-73a2ee76]{ padding: 0; border-radius: 3px; background: #…

分享数字孪生潭江流域建设与实践论文

数字孪生潭江流域建设 广东省水利厅 以支撑江门市沿线水工程精准联调联控&#xff0c;提升水旱灾害防御能力为首要任务&#xff0c;融合多信息源预报、GIS等技术&#xff0c;建立气象-水文-水动力集一体的复杂流域入库径流预报及其洪涝延伸预报模型平台&#xff0c;构建具有“…

HTMLElement.click()的回调触发踩坑

先看看以下代码 const el document.getElementById("btn") el.addEventListener("click", () > {Promise.resolve().then(() > console.log("microtask 1"));console.log("1"); }); el.addEventListener("click", (…

Spring Boot 手写starter!!!

原因&#xff1a;为什么要手写starter&#xff1f;&#xff1f;&#xff1f; 原因&#xff1a;简化功能。 实例&#xff1a;以分页为例&#xff1a;写一个starter。 1.首先定义一个PageX注解。 Target({ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documented p…

mac/windows git ssh 配置多平台账号(入门篇)

目录 引子多账号多平台配置git一、.ssh文件夹路径1.1 mac 系统1.2 windows 系统 二、生成new ssh2.1 mac系统2.2 windows 系统 三、配置 config四、验证五、用ssh方式拉取远程仓库代码 引子 push代码到github仓库时&#xff0c;提示报错。 Push failed Remote: Support for pa…

Redis部署方式(一)四种部署方式介绍

redis的四种部署方式&#xff1a; Redis单机模式部署、Redis主从模式部署、Redis哨兵模式部署、Cluster集群模式部署&#xff0c;后面三种&#xff08;主从模式&#xff0c;Sentinel哨兵模式&#xff0c;Cluster模式&#xff09;也可以统称为集群模式。 一、单机 1、缺点&…

XFF伪造 [MRCTF2020]PYWebsite1

打开题目 直接查看源码 看到一个./flag.php 访问一下 购买者的ip已经被记录&#xff0c;本地可以看到flag&#xff0c;那么使用xff或者client-ip伪造一下ip试试 bp抓包 加一个X-Forwarded-For头 得到flag

T-Dongle-S3开发笔记——分区表

参考&#xff1a; ESP32之 ESP-IDF 教学&#xff08;十三&#xff09;—— 分区表_esp32分区表-CSDN博客 分区表 - ESP32 - — ESP-IDF 编程指南 latest 文档 (espressif.com) 分区表是 ESP32 划分内部 flash 闪存的清单&#xff0c;它将 flash 划分为多个不同功能的区域用于…