《周志明的软件架构课》学习笔记 Day11
1.主动学习
TCC事务
TCC(Try-Confirm-Cancel)
TCC 方案,它天生适合用于需要强隔离性的分布式事务中,它是一种业务侵入性较强的事务方案,要求业务处理过程必须拆分为“预留业务资源”和“确认 / 释放消费资源”两个子过程
Try:尝试执行阶段,完成所有业务可执行性的检查(保障一致性),并且预留好事务需要用到的所有业务资源(保障隔离性)。
Confirm:确认执行阶段,不进行任何业务检查,直接使用 Try 阶段准备的资源来完成业务处理。注意,Confirm 阶段可能会重复执行,因此需要满足幂等性。
Cancel:取消执行阶段,释放 Try 阶段预留的业务资源。注意,Cancel 阶段也可能会重复执行,因此也需要满足幂等性。
TCC 在业务执行的时候,只操作预留资源,几乎不会涉及到锁和资源的争用,所以它具有很高的性能潜力。
所以,通常我们并不会完全靠裸编码来实现 TCC,而是会基于某些分布式事务中间件(如阿里开源的Seata)来完成,以尽量减轻一些编码工作量。
TCC对业务侵入性强, 当需要对接外部系统时基本无法实现, 不可能到别人的系统里去改造
SAGA 事务
SAGA 事务基于数据补偿代替回滚的柔性事务
SAGA 必须保证所有子事务都能够提交或者补偿,但 SAGA 系统本身也有可能会崩溃,所以它必须设计成与数据库类似的日志机制(被称为 SAGA Log),以保证系统恢复后可以追踪到子事务的执行情况,比如执行都到哪一步或者补偿到哪一步了。
尽管补偿操作通常比冻结 / 撤销更容易实现,但要保证正向、反向恢复过程能严谨地进行,也需要你花费不少的工夫。比如,你可能需要通过服务编排、可靠事件队列等方式来完成。所以,SAGA 事务通常也不会直接靠裸编码来实现,一般也是在事务中间件的基础上完成。我前面提到的 Seata 就同样支持 SAGA 事务模式。
AT事务
它大致的做法是在业务数据提交时,自动拦截所有 SQL,分别保存 SQL 对数据修改前后结果的快照,生成行锁,通过本地事务一起提交到操作的数据源中,这就相当于自动记录了重做和回滚日志。
如果分布式事务成功提交了,那么我们后续只需清理每个数据源中对应的日志数据即可;而如果分布式事务需要回滚,就要根据日志数据自动产生用于补偿的“逆向 SQL”。
而使用的代价就是大幅度地牺牲了隔离性,甚至直接影响到了原子性。因为在缺乏隔离性的前提下,以补偿代替回滚不一定总能成功。
备注
摘自极客时间 - 周志明老师的公开课《周志明的软件架构课》 <- 极其推荐大家阅读~>
2. 写在最后
阿里中间价 SeaTa 既支持TCC也支持SAGA
CAP 定理决定了 C 与 A 不可兼得,传统的 ACID 强一致性在分布式环境中,要想能保证一致性(C),就不得不牺牲可用性(A)。那么这个时候,随着分布式系统中节点数量的增加,整个系统发生服务中断的概率和时间都会随之增长。
所以,我们只能退而求其次,把“最终一致性”作为分布式架构下事务处理的目标。在这两节课中,我给你介绍的可靠事件队列、TCC 和 SAGA,都是实现最终一致性的三种主流模式。
《周志明的软件架构课》学习笔记 Day11相关推荐
- 读《周志明的软件架构课》--学习笔记和感想随笔
主要记录对周老师的<周志明的软件架构课>的学习笔记,本篇章是对课程不可变基础设施部分的学习,从虚拟化的技术理解容器技术的产生和发展,从部署运维角度理解应用的封装,从网络虚拟化理解容器网络, ...
- 《周志明的软件架构课》学习笔记 Day6
1.主动学习 RESTful 服务 REST概念:资源,表征,状态,转移. 服务端与客户端分离(Client-Server) 无状态(Stateless) 可缓存(Cacheability) 分层系统 ...
- 《周志明的软件架构课》学习笔记 Day7
1.主动学习 本地事务如何实现原子性和持久性 事务处理 事务处理几乎是每一个信息系统中都会涉及到的问题,它存在的意义就是保证系统中的数据是正确的,不同数据间不会产生矛盾,也就是保证数据状态的一致性(C ...
- 《周志明的软件架构课》学习笔记 Day1
1.主动学习 每个开发者都需要学习「如何构建一个可靠的分布式系统」 工作这么多年,发现架构设计,还是需要从业务中来迭代,「作为一名架构师,在软件研发的过程中,最难的事儿,其实并不是如何解决具体某个缺陷 ...
- 《周志明的软件架构课》学习笔记 Day5
1.主动学习 远程服务调用(Remote Procedure Call,RPC) RPC 是我们构建分布式系统的最基本前置条件. 这篇文章我们来了解周志明老师笔下的 RPC. RPC 出现的最初目的, ...
- 《周志明的软件架构课》学习笔记 Day15
主动学习 负载均衡 集群部署的特点 信息系统都需要利用多台机器来扩展服务能力,希望用户的请求不管连接到哪台机器上,都能得到相同的处理. 必须对用户一侧保持足够的透明,即使请求背后是由一千台.一万台机器 ...
- 《周志明的软件架构课》学习笔记 Day16
主动学习 服务端缓存 为系统引入缓存的理由 从开发角度来说,引入缓存会提高系统的复杂度,因为你要考虑缓存的失效.更新.一致性等问题(硬件缓存也有这些问题,只是不需要由你来考虑,主流的 ISA 也都没有 ...
- 《周志明的软件架构课》学习笔记 Day13
主动学习 浏览器的客户端缓存 背景:当万维网刚刚出现的时候,浏览器的缓存机制差不多就已经存在了.在 HTTP 协议设计之初,人们便确定了服务端与客户端之间"无状态"(Statele ...
- 周志明jvm第三版笔记-第一部分:第一章 走进java
1.1 概述:java过去.现在.未来简要概述 1.2 java技术体系 Java技术体系包括了以下几个组成部分: Java程序设计语言: 各种硬件平台上的Java虚拟机实现: Class文件格式: ...
最新文章
- halcon区域腐蚀膨胀算子_OpenCV 图像处理之膨胀与腐蚀
- 齐博地方门户系统v5_社区团购小程序哪个好?-小猪V5社区团购系统,社区团购系统,社区团购小程序,专注社区团购系统研发...
- Pycharm连接远程服务器进行代码调试开发
- js对象数组转java对象数组对象数组对象数组对象,前台js数组json字符串,后台json转为对象数组的具体实现...
- 【转】如何开始学习CoreCLR源代码?
- uft自动化测试工具安装步骤_自动化功能测试和接口测试工具整理
- [9] ADB 查看设备信息
- 定义空列表元素类型_python数据类型是什么
- 2019年企业数据生产力调研报告,90%的人都没看过
- mysql怎么保证热点数据_MySQL里有2000w数据,redis中只存20w数据,如何保证redis中数据都是热点数据...
- sticky-footer布局
- 计算机学院硕导北京工业大学,北京工业大学
- 《华为研发》阅读 - 11 (中研部组织结构)
- 2022 年云计算发展趋势
- 计算机网络基本知识(二):网络拓扑结构
- 赵小楼《天道》《遥远的救世主》深度解析(54)简单聊聊基督的信仰、教义和天堂的说法
- Unity 使用BitmapFont制作自定义字体
- 【CSS】固定区域竖向滚动
- 用了十年竟然都不对,Java、Rust、Go主流编程语言的哈希表比较
- android 6.0 电池曲线,Android6.0 RK3399 电池系统(一)BQ25700 IC 驱动分析 · Younix’s Studio...