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

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

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.rhkb.cn/news/263387.html

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

相关文章

提升代码能力:程序员的进阶之路

提升代码能力:程序员的进阶之路 在当今日益发展的技术领域,程序员的代码能力对于个人职业发展至关重要。优秀的代码能力不仅能提高开发效率,还能产生高质量的软件和解决方案。然而,提升代码能力是一个不断学习和成长的过程。本文将…

备战蓝桥杯—— 双指针技巧巧答链表2

对于单链表相关的问题,双指针技巧是一种非常广泛且有效的解决方法。以下是一些常见问题以及使用双指针技巧解决: 合并两个有序链表: 使用两个指针分别指向两个链表的头部,逐一比较节点的值,将较小的节点链接到结果链表…

C语言实现简单选择排序

简单选择排序 简单选择排序的平均复杂度为 O(n2),但效率通常比相同平均复杂度的直接插入排序还要差。但由于选择排序是 内部排序,因此在内存严格受限的情况下还是可以用的。选择排序的原理很简单,如下图所示:持续从未处理元素中找到最小值并加…

windows安装 RabbitMQ

首先打开 RabbitMQ 官网,点击 Get Started(开始) 点击 Download Installation(下载安装)。 这里提供了两种方式进行安装,我们使用第二种方法。 使用 chocolatey以管理用户身份使用官方安装程序 往下滑,第二种方法需要 Erlang 的依赖&#x…

pikachu靶场-File Inclusion

介绍: File Inclusion(文件包含漏洞)概述 文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如 在PHP中,提供了&…

【webrtc】m77 PacedSender

mediasoup是m77的代码,m77的代码并没有paced controller ,而且与paced sender 的逻辑混在了一起。结合大神们的代码分析,对照m77 进行 理解。m77 有ProbeController。给pacersender 更新飞行数据:PacedSender::InsertPacket(size_t bytes) 对应的是 PacingController::OnPa…

【Java】基础——反射(Reflection)基础

目录 1. 反射概述 引言 1.1 反射是什么? 1.2 反射提供的功能 1.3 反射的作用 2. 获取类的信息 2.1 获取反射中的Class对象 2.2 通过反射创建类对象 2.3 通过反射获取类的成员变量 2.4 通过反射获取类的方法 1. 反射概述 引言 本篇对反射基础进行了讲解。…

Java EE改名Jakarta EE,jakarta对程序开发的影响

一、前言 很多Java程序员在使用新版本的Spring6或者springboot3版本的时候,发现了一些叫jakarta的包。我在阅读开源工作流引擎camunda源代码的时候,也发展了大量jakarta的工程包。 比如:camunda的webapps编译工程就提供了2种方式javax和jaka…

Stable Diffusion 模型分享:A-Zovya RPG Artist Tools(RPG 大师工具箱)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八下载地址模型介绍 A-Zovya RPG Artist

java+springmvc+springboot众筹救助系统mybatis

儿童众筹救助系统在流畅性,续航能力,等方方面面都有着很大的优势。这就意味着儿童众筹救助系统的设计可以比其他系统更为出色的能力,可以更高效的完成最新的救助基金、救助申请、众筹项目、捐赠信息等功能。 此系统设计主要采用的是JAVA语言来…

前端学习——vue学习

文章目录 1. < el-form> 属性 model、prop、rules2. v-bind 与 v-model3. v-if 与 v-show4. v-for 循环语句5. 计算属性 computed6. 监视属性 watch7. 下拉框 el-select、el-option8. 自定义事件9. async与await实现异步调用 1. < el-form> 属性 model、prop、rule…

Escalate_Linux-环境变量劫持提权(5)

环境变量劫持提权 在Shll输入命令时&#xff0c;Shel会按PAH环境变量中的路径依次搜索命令&#xff0c;若是存在同名的命令&#xff0c;则执行最先找到的&#xff0c;若是PATH中加入了当前目录&#xff0c;也就是“”这个符号&#xff0c;则可能会被黑客利用&#xff0c;例如在…

字符串(算法竞赛)--Manacher(马拉车)算法

1、B站视频链接&#xff1a;F05 Manacher(马拉车)_哔哩哔哩_bilibili 题目链接&#xff1a;【模板】manacher - 洛谷 ​ #include <bits/stdc.h> using namespace std; const int N3e7; char a[N],s[N]; int d[N];//回文半径函数void get_d(char*s,int n){d[1]1;for(int…

线段树学习笔记 下

可持久化线段树 上面两篇是几年前写的&#xff0c;笔者今日才加以整理&#xff0c;如有错误请见谅。 线段树加上版本就是可持久化线段树。 Problem Intro 给定一个数组&#xff0c;只需要单点修改和单点查询&#xff0c;但要维护版本。 具体说&#xff0c;每一次操作可能从…

五、分类算法 总结

代码&#xff1a; from sklearn.datasets import load_iris, fetch_20newsgroups from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.naive_bayes import MultinomialNB from s…

Stable Diffusion 模型的概念、类型、下载、安装、使用

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 我们在《Stable Diffusion WebUI 界面介绍》 时&#xff0c;第一个就讲到了 Stable Diffusion 模型&#xff0c;那么这个模型是什么&#xff1f;该从哪儿下载&…

东方博宜 1519. 求1~n中每个数的因子有哪些?

东方博宜 1519. 求1~n中每个数的因子有哪些&#xff1f; #include<iostream> using namespace std; int main() {int n ;cin >> n ;for(int i 1 ; i < n ; i){int a[1000] ;int k 0 ;for(int j 1 ; j < i ; j){if(i%j0){a[k] j ;k ;} }cout << i …

前端工程化面试题 | 17.精选前端工程化高频面试题

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

JVM(1)

JVM简介 JVM是Java Virtual Machine的简称,意为Java虚拟机. 在java中,它归属于jre(java运行时环境), 而jre归属于jdk(java开发工具包). 虚拟机是指通过软件模拟的具有完整硬件功能的,运行在一个完全隔离的环境中的完整计算机系统. 常见的虚拟机:JVM, VMwave, VirtualBox. J…

Spring Security学习(七)——父子AuthenticationManager(ProviderManager)

前言 《Spring Security学习&#xff08;六&#xff09;——配置多个Provider》有个很奇怪的现象&#xff0c;如果我们不添加DaoAuthenticationProvider到HttpSecurity中&#xff0c;似乎也能够达到类似的效果。那我们为什么要多此一举呢&#xff1f;从文章的效果来看确实是多…