分布式与一致性协议之TCC协议

TCC协议

概述

虽然MySQL XA能实现数据层的分布式事务,解决多个MySQL操作的事务问题,但还面临别的问题:在接收到外部的指令后,需要访问多个内部系统,执行指令约定的操作,还必须保证指令执行的原子性(也就是事务要么全部成功,要么全部失败)。那么如何实现指令执行的原子性呢?答案是TCC.
在我看来,基于二阶段提交的XA规范实现的是数据层面操作的事务,而TCC能实现业务层面操作的事务。理解了二阶段提交协议和TCC后,我们就可以从数据层面到业务层面更加全面地理解如何实现分布式事务了,从而在日常工作中更清楚地知道如何处理操作地原子性或者系统状态的一致性等问题。

我们还是先来看一道思考题。
以如何实现订票系统为例,假设现在要实现一个给内部员工提供机票订购服务的企鹅订票系统,但在实现订票系统时,我们需要考虑这样的情况:我想从深圳飞北京,但没有直达的机票,要先顶深圳航空的航班从深圳去上海,再定上海航空的航班从上海去北京,如图所示。
因为我的目的地时北京,所以如果只有一张机票订购成功肯定是不行的。这个系统必须保障两个订票操作的事务要么全部成功,要么全部不成功,那么该如何实现两个订票操作的事务呢?带着这个问题,我们先来了解下什么是TCC
在这里插入图片描述

什么是TCC

前面已经在CAP理论介绍了TCC,这里只想补充一点:可以对比二阶段提交协议来理解TCC包含的预留(Try)、确认(Confirm0或撤销(Cancel)这两个阶段,分析如下。

  • 1.预留和二阶段提交协议中的提交请求阶段的操作类似,具体是指系统会将需要确认的资源预留、锁定,确保确认操作一定能执行成功。
  • 2.确认和二阶段提交协议中的提交执行阶段的操作类似,具体是指系统将最终执行的操作
  • 3.撤销比较像二阶段提交协议中的回滚操作,具体是指系统将撤销之前预留的资源,也就是撤销已执行的预留操作对系统产生的影响。

在我看来,二阶段提交协议和TCC的目标都是实现分布式事务,这也就决定了它们在思想上是类似的。但是这两种算法解决的问题场景是不同的,一个是数据层面,一个是业务层面,这就决定了它们在细节实现是不同的。所以接下来,我们就一起看看TCC的细节。
为了更好地演示TCC的原理,我们假设深圳航空、上海航空分别为订票系统提供了以下3个接口:机票预留接口、确认接口和撤销接口。那么这时,订票系统可以这样来实现操作的事务。
首先,订票系统调用两个航空公司的机票预留接口,向两个航空公司申请机票预留。如图所示。在这里插入图片描述

如果两个机票都预留成功,那么订票系统将执行确认操作,也就是订购机票,如图所示。
在这里插入图片描述

但如果此时有机票没有预留成功(比如深圳航空从深圳到上海的机票),那么该怎么办呢?这时订票系统就需要通过撤销解耦来撤销订票请求,如图所示。在这里插入图片描述

至此,我们就实现了订票操作的事务。在我看来,TCC的难点不在于理解TCC的原理,而在于如何根据实际场景特点来实现预留、确认、撤销3个操作。所以,为了更深刻地理解TCC的3个操作的实现要点,将以一个实际项目为例展开详细说明。

如何通过TCC实现指令执行的原子性

前文提到,当接收到外部指令时,需要实现操作1、2、3,如果其中任何一个操作失败,那么我都需要暂停指令执行,将系统恢复到操作未执行状态,然后重试,如图所示.在这里插入图片描述
其中,操作1、2、3的含义具体如下.

  • 1.操作1:生成指定URL页面对应的图片并持久化存储
  • 2.操作2:调用内部系统1的接口,禁用指定域名的访问权限
  • 3.操作3:通过MySQL XA更新多个数据库的数据记录。

那么我是如何通过TCC来解决这个问题的呢?答案是我在实现每个操作时都会分别实现响应的预留、确认、撤销操作.

首先,操作1是生成指定URL页面对应的图片,具体操作如下:

  • 1.预留操作:生成指定页面的图片并存储到本地
  • 2.确认操作:更新操作1状态为完成
  • 3.撤销操作:删除本地存储的图片

其次,因为操作2是调用内部系统1的解耦,禁用该域名的访问权限,具体操作如下.

  • 1.预留操作:调用内部系统1的禁用指定域名的预留接口,通知内部系统1预留相关的资源
  • 2.确认操作:调用内部系统1的禁用指定域名的确认接口,执行禁用域名的操作
  • 3.撤销操作:调用内部系统1的禁用指定域名的撤销接口,撤销对该域名的禁用,并通知内部系统1释放相关的预留资源

最后,操作3是通过MySQL XA更改多个MySQL数据库中的数据记录,并实现数据更新的事务,具体操作如下.

  • 1.预留操作:执行XA START和XA END命令准备好事务分支操作,并调用XA PREPARE执行二阶段提交协议的提交请求,预留相关资源
  • 2.确认操作:调用XA COMMIT执行确认操作
  • 3.撤销操作:调用XA ROLLBACK执行回滚操作,释放在预留阶段预留的资源.

可以看到,确认操作时预留操作的下一个操作,而撤销操作则是用来撤销一致性的预留操作对系统产生的影响,类似在复制粘贴时,我们通过"Ctrl Z"撤销"Ctrl V"操作的执行,如图所示,这是理解TCC的关键在这里插入图片描述

综上所述,我们首先执行操作1、2、3的预留曹祖,如果预留操作都执行成功了,那么我们将执行确认操作,继续向下执行。但如果预留操作只是部分执行成功,那么我们将执行撤销操作,取消预留操作对系统产生的影响。通过这种方式(指令对应的操作要么全部执行,要么全部不执行),我们就能实现指令的原子性了。
另外,在执行确认、撤销操作时,有一点需要我们尤为注意,即这两个操作在执行时可能会重试,所以它们需要支持幂等性

重点总结

  • 1.TCC是个业务层面的分布式事务协议,而XA规范是数据层面的分布式事务协议,这也是TCC和XA规范的最大区别。TCC与业务紧密耦合,在实际场景中,需要我们根据场景特点和业务逻辑设计响应的预留、确认、撤销操作。相比MySQL XA,TCC有一定的编程开发工作量。
  • 2.因为TCC是在业务代码中编码实现的,所以,TCC可以跨数据库、跨业务系统实现资源管理,满足复杂业务场景下的事务需求。比如,TCC可以将对不同的数据库、不同的业务系统的多个操作通过编码方式转换为一个原子操作,实现事务
  • 3.因为TCC的每一个操作对于数据库来讲,都是一个本地数据库事务,所以当操作结束时,本地数据库事务的执行就完成了,相关的数据库资源也就被释放了,这就避免了数据库层面的二阶段提交协议长时间锁定资源,导致系统性能低下的问题。

想必你会有这样的疑问:如果有人作恶,Raft、TCC这些算法还使用吗?答案时不适用,因为Raft、TCC算法时非拜占庭容错算法,不适用于拜占庭容错的场景,而常用的拜占庭容错算法有PBFT、PoW算法

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

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

相关文章

nestjs 全栈进阶--中间件

视频教程 22_nest中中间件_哔哩哔哩_bilibili 1. 介绍 在Nest.js框架中,中间件(Middleware)是一个非常重要的概念,它是HTTP请求和响应生命周期中的一个重要组成部分,允许开发者在请求到达最终的目的控制器方法之前或…

机器学习算法 - 逻辑回归

逻辑回归是一种广泛应用于统计学和机器学习领域的回归分析方法,主要用于处理二分类问题。它的目的是找到一个最佳拟合模型来预测一个事件的发生概率。以下是逻辑回归的一些核心要点: 基本概念 输出:逻辑回归模型的输出是一个介于0和1之间的…

【数据结构】队列详解(Queue)

文章目录 有关队列的概念队列的结点设计及初始化队列的销毁判空和计数入队操作出队操作 有关队列的概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)入队列:进行插入操作的一端…

Redis不同数据类型value存储

一、Strings redis中String的底层没有用c的char来实现,而是使用SDS数据结构( char buf[])。 缺点:浪费空间 优势: 1.c字符串不记录自身的长度,所以获取一个字符串长度的复杂度是O(N),但是SDS记录分配的长度alloc,已使用长度len,获取长度的…

CSS文字描边,文字间隔,div自定义形状切割

clip-path: polygon( 0 0, 68% 0, 100% 32%, 100% 100%, 0 100% );//这里切割出来是少一角的正方形 letter-spacing: 1vw; //文字间隔 -webkit-text-stroke: 1px #fff; //文字描边1px uniapp微信小程序顶部导航栏设置透明,下拉改变透明度 onP…

[js] 递归,数组对象根据某个值进行升序或者降序

一、效果图 1.1 父级 1.2 父级与子级 二、代码 升序降序&#xff0c;只要把 a.num - b.num 改成 b.num - a.num <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, i…

pycharm 将项目连同库一起打包及虚拟环境的使用

目录 一、创建虚拟环境 1、用 anaconda 创建 2、Pycharm 直接创建 二、虚拟环境安装第三方库 1、创建项目后&#xff0c;启动终端(Alt F12)&#xff0c;或者点击下方标记处。 2、使用 pip 或者 conda 来进行三方库的安装或卸载 3、将项目中的库放入文档&#xff0c;便于…

Dual Aggregation Transformer for Image Super-Resolution论文总结

题目&#xff1a;Dual Aggregation Transformer&#xff08;双聚合Transformer&#xff09; for Image Super-Resolution&#xff08;图像超分辨&#xff09; 论文&#xff08;ICCV&#xff09;&#xff1a;Chen_Dual_Aggregation_Transformer_for_Image_Super-Resolution_ICCV…

Android之给Button上添加按压效果

一、配置stateListAnimator参数实现按压效果 1、按钮控件 <Buttonandroid:id"id/mBtnLogin"android:layout_width"match_parent"android:layout_height"48dp"android:background"drawable/shape_jfrb_login_button"android:state…

腾讯共享WiFi项目的加盟方式有哪些?

在这个互联互通的时代&#xff0c;共享经济的浪潮正以前所未有的力量席卷全球&#xff0c;而腾讯作为中国互联网巨头之一自然不会错过这场盛宴。其推出的腾讯共享WiFi项目自问世以来就备受瞩目&#xff0c;它不仅为用户提供便捷的上网服务&#xff0c;更为创业者打开了一个全新…

Language2Pose: Natural Language Grounded Pose Forecasting # 论文阅读

URL https://arxiv.org/pdf/1907.01108 TD;DR 19 年 7 月 cmu 的文章&#xff0c;提出一种基于 natural language 生成 3D 动作序列的方法。通过一个简单的 CNN 模型应该就可以实现 Model & Method 首先定义一下任务&#xff1a; 输入&#xff1a;用户的自然语言&…

win10电脑桌面便签纸怎么设置?添加桌面便签方法

对于上班族来说&#xff0c;电脑桌面上的电子便签纸是一项不可或缺的工具。在快节奏的工作环境中&#xff0c;我们经常需要随时记录重要信息、安排工作任务&#xff0c;而电子便签纸以其便捷性和实时性成为了我们的得力助手。 想象一下&#xff0c;在紧张的项目讨论中&#xf…

mysql 细分

索引选择性 索引列的唯一值数量 / 表中的总行数 mysql如何优化-CSDN博客 批量问题 批处理默认是逐条发送 SQL 到数据库的&#xff0c;没有充分利用数据库提供的原生批处理能力&#xff0c;需要额外的配置来启用真正的批处理支持&#xff0c;如使用ExecutorType.BATCH 自定…

提升网络性能,解决网络故障,了解AnaTraf网络流量分析仪

在当今数字化时代&#xff0c;网络性能监测与诊断(Network Performance Monitoring and Diagnosis,NPMD)成为了企业和个人关注的焦点。随着网络流量不断增长&#xff0c;确保网络的稳定性和高效性变得更加重要。在这个领域&#xff0c;AnaTraf网络流量分析仪是您不可或缺的得力…

自然资源-土地征收成片开发知识梳理

自然资源-土地征收成片开发知识梳理 1、什么是成片开发 &#xff1f; 自然资源部印发的《土地征收成片开发标准&#xff08;试行&#xff09;》对成片开发的概念做了界定&#xff0c;成片开发是指在国土空间规划确定的城镇开发边界内的集中建设区&#xff0c;由县级以上地方人…

章十二、数据库(1) —— 概述、MySQL数据库、SQL、DDL、DML、DQL、多表设计

为什么学习数据库&#xff1a; ● 实现数据持久化到本地&#xff1b; ● 使用完整的管理系统统一管理&#xff0c;可以实现结构化查询&#xff0c;方便管理&#xff1b; 一、 数据库概述 ● 数据库 数据库&#xff08;DataBase&#xff09;为了方便数据的 存储 和 管理 &…

LLM记录:五一 Llama 3 超级课堂

LLM记录&#xff1a;五一 Llama 3 超级课堂 想玩大模型&#xff0c;自己又没那个环境&#xff0c;参加五一 Llama 3 超级课堂&#xff0c;简单记录一下llama3-8b的相关体验&#xff0c;实在是邀请不到人&#xff0c;还好后面开放了24G显存&#xff0c;好歹模型能跑起来了&…

TCP UDP

传输层 端口号 tcp udp 网络层 IP地址 IP TCP&#xff0c;UDP 1&#xff0c;TCP是面向链接的协议&#xff0c;而UDP是无连接的协议; 2&#xff0c;TCP协议的传输是可靠的&#xff0c;而UDP协议的传输“尽力而为” 3&#xff0c;TCP可以实现流控&#xff0c;但UDP不行;…

怎么找回回收站里删除的XLS文件?5个恢复方法

我们经常会使用到XLS文件来存储和整理数据。然而有时候由于误操作或不小心&#xff0c;我们可能会将重要的XLS文件删除&#xff0c;并且这些文件可能还被清空出了回收站。面对这种情况许多人会感到焦虑和无助。但是不必过于担心&#xff0c;因为有专门的软件可以帮助我们找回这…

如何使用 ArcGIS Pro 制作地震动画

在做某些汇报的时候&#xff0c;除了图文&#xff0c;如果有动画肯定会成为加分项&#xff0c;这里为大家介绍一下如何使用 ArcGIS Pro 制作地震动画&#xff0c;希望能对你有所帮助。 添加时间 在图层属性内&#xff0c;选择时间选项卡&#xff0c;图层时间选择每个要素具有…