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

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

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系统本身也有可能会崩溃,所以他必须被设计成数据库类似的日志机制以保证系统恢复后可以追踪到子事务的执行情况。例如直行道哪一步或者补偿到哪一步了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot-2.7.6基于SLF4J日志门面的日志框架切换

SpringBoot 没有强制性的日志记录依赖项,但 Commons Logging API 除外,它通常由 Spring Framework 的模块提供。 要使用 Logback,您需要将其包含在类路径中。 推荐的方法是您只需要通过启动器,这都取决于 . 对于 Web 应用程序 ,因为它可传递地依赖于日志记录启动器。 如果…

持续集成,持续交付和持续部署的概念,以及GitLab CI / CD的介绍

引言:上一期我们部署好了gitlab极狐网页版,今天我们介绍一下GitLabCI / CD 目录 一、为什么要 CI / CD 方法 1、持续集成 2、持续交付 3、持续部署 二、GitLab CI / CD简介 三、GitLab CI / CD 的工作原理 4、基本CI / CD工作流程 5、首次设置 …

ELK入门(三)-Kibana

Kibana Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级…

让C语言代码变抽象(二)

目录 前言: 代码: 前言: 在今天写代码的时候,我又想到一个更抽象的代码。 我在写注释的时候突然想想到条件编译的东西,好像也能用来注释东西。 代码: 我们在这直接上干货 我们知道在条件编译中有一个叫…

鸿蒙开发-DevEcoStudio的安装及使用

DevEcoStudio的安装及使用 前言 DevEcoStudio分为两个版本,分别用于HarmonyOS和OpenHarmony开发,截止文档编写时,用于开发HarmonyOS的DevEcoStudio版本为3.1.1,适用于OpenHarmony的DevEcoStudio版本为4.0.0。 接下来的文档是基…

React18源码: schedule任务调度messageChannel

React调度原理(scheduler) 在React运行时中,调度中心(位于scheduler包)是整个React运行时的中枢(其实是心脏),所以理解了scheduler调度,就基本掌握了React的核心React两大循环:从宏…

年关将至送大礼 社区适时献爱心

在这个快节奏的时代,社区作为人们生活的重要组成部分,其凝聚力和互助精神显得尤为重要。2024年2月7日,实践队员李若钰有幸参与了社区礼盒分装的活动,这不仅仅是一次简单的劳动,更是一次心灵的洗礼和感悟。 礼盒分装&am…

HTML5和CSS3提高

一、HTML5的新特性 增加了一些新的标签,新的表单,新的表单属性,IE9以上版本的浏览器才支持 注意: 这些语义化标准主要针对搜索引擎的 新标签可以使用多次 在IE9中需要把这些元素转化为块级元素 新增的多媒体标签 主要包含两个…

Java JDBC:林浩然与杨凌芸的编程奇缘

Java JDBC:林浩然与杨凌芸的编程奇缘 Java JDBC: The Programming Odyssey of Lin Haoran and Yang Lingyun 在那个充满二进制和算法符号的世界里,我们的男主角林浩然,一个热爱Java的码农新秀,正准备踏上他的JDBC探险之旅。他那双…

【vscode】按F5无法执行调试python或go

原因: 找不到解析器,需要安装插件(python,或go 等) 安装插件后,还是无法执行,按 ctrlshiftp,看不到解析器 正常应该是: 解决方法: 1、判断python是否安装成功 pyth…

Selenium(简单入门)

请直接看原文:selenium 使用教程详解-java版本 - 小葛师兄 - 博客园 (cnblogs.com) -------------------------------------------------------------------------------------------------------------------------------- 第一章 Selenium 概述# 1.1.Selenium 发展史# ​ …

“从根到叶:深入理解排序数据结构“

一.排序的概念及引用 1.1排序的概念 排序是指将一组数据按照一定的规则重新排列的过程。排序的目的是为了使数据具有有序性,便于查找、插入、删除等操作,提高数据的组织和管理效率。 稳定性是指如果序列中存在相等元素,在排序完成后&#…

五、矩阵的运算

1、矩阵的加减: 前提:两个矩阵必须是同形矩阵。 矩阵加减具有交换律,矩阵矩阵相乘没有交换律。 计算结果:元素级运算。 2、矩阵的数乘: 计算结果:元素级运算。这里要区别与行列式的数乘。 3、矩阵与向量的乘…

fiddler抓取,Android真机测试

1.配置Fiddler抓取并解密HTTPS包 Fiddler默认是不抓取HTTPS包的,需要进行相应的配置。 打开Fiddler,选择“Tools->Fiddler Options...” 2.在弹出的对话框中选择“HTTPS”选项卡: 3.勾选“Capture HTTPS CONNECTs”,接着勾选…

多人协作记账账本小程序开源版开发

多人协作记账账本小程序开源版开发 支持多人协作的记账本小程序,可用于家庭,团队,组织以及个人的日常收支情况记录,支持周月年度统计 便捷记账 便捷的记账方式,支持多种记账类型,快捷切换账本等 多账本 支…

springboot751社区维修平台

springboot751社区维修平台 获取源码——》公主号:计算机专业毕设大全

Element使用Message消息提示

Element使用Message消息提示 一、导入Element1、npm 安装2、引入 Element3、实现代码4、效果 一、导入Element 1、npm 安装 推荐使用 npm 的方式安装 npm i element-ui -S2、引入 Element 在 main.js 中写入以下内容 import ElementUI from element-ui; import element-ui…

内核解读之内存管理(6)address_space建立文件索引结点inode和页page、虚拟地址空间vma的映射

内存管理和文件系统总会交织在一起,所以我们今天聊的内容和文件系统有关。 上一节的struct page结构体中,我们看到了一个成员struct address_space*。很明显是用于建立page和address_space的关联。 它是代表某个地址空间吗?实际上不是的&am…

新版Java面试专题视频教程——虚拟机篇②

新版Java面试专题视频教程——虚拟机篇② 3 垃圾收回3.1 简述Java垃圾回收机制?(GC是什么?为什么要GC)3.2 对象什么时候可以被垃圾器回收3.2.1 引用计数法3.2.2 可达性分析算法 3.3 JVM 垃圾回收算法有哪些?——4种3.3…