这可能是你读过最透彻的TCC方案讲解|分布式事务系列(三)

news2024/9/23 13:40:53

本文从两个场景说起,详细描述了TCC的详细过程,以及对比2PC有什么区别,适用什么样的场景。

点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达

在面试前复习 TCC 的时候你是不是这样做的:百度TCC关键词,随便找了篇文章,查询到他有try、confirm、Cancel 三个阶段,业务侵入度高,和两阶段差不多。复习完毕。

如果你是这样去理解和复习的,只能说对 TCC 的理解太不到位了,真的有必要耐心看完这篇文章。

TCC

有些人可能觉得 TCC 和两阶段提交非常相似,无法区分。首先强调,TCC是一种最终一致性方案,他并不是强一致性。如果你不了解两阶段提交,请先看这篇。

1b3a7215527ebb28fe3ceba9f5c55e09.jpeg

分布式事务,强一致性方案有哪些?|分布式事务系列(二)


这篇文章我们来探讨下 TCC 到底是什么,他用来解决什么问题?在继续阅读之前,我先抛出两个问题。

一个面试中的问题

在某大厂面试的时候,面试官问了我一个问题:由于我介绍的是一个支付项目,业务系统调用支付系统扣款成功后采用本地事务状态表(最终一致性)的方案通知业务系统。由于我们的系统QPS并不高,所以我自认为这样的方案是没问题的。

但是面试官问我,如果扣款成功后订单系统数据库写入不可用怎么办?虽然用户支付成功,但是即使有短暂几分钟的写入不可用也会导致客诉暴涨,你怎么解决这个问题?

这让我意识到,如果在高并发场景下这个方案是有问题的。本地事务状态表的缺点就是及时性不够,当然这个可以通过再本地事务结束后及时发起对业务的通知解决。但是有个问题无法解决,本地事务状态表都是基于本地业务执行成功后,下游依赖业务也会成功。如果下游系统发生不可用问题,我们的本地事务状态表中状态将阻塞在这里,出现上述支付扣款后一直无法通知到订单的情况。

电商超卖问题

除了上述面试问题,还有一个电商中很常见的超卖问题。

还是以电商场景下的余额支付、扣库存为例。如果我们采用可靠消息队列或者本地事务表的方案,用户购买了一瓶可乐,余额扣款成功后发送消息到库存系统,库存系统对可乐的库存减1。如果是只有一个用户买并且库存充足的情况下这是没有问题的,但是如果此时有3个用户在购买可乐,但是库存仅剩 1 瓶,支付前使用接口检查剩余库存的时候是通过的。但是等到支付成功,扣减库存的消息同步到库存服务的时候系统就会出现超卖 2 瓶的情况。

0b763f4b1f7961e5f6e4cca1f5d72559.png

之所以出现上述问题,是因为创建订单在业务上是用户之间隔离的,业务上不会有资源的竞争,但是库存数据是一种共享资源,多个用户同时购买同样的商品就会出现并发问题,所以需要不同的线程之间事务隔离。

实现隔离性可以使用我们之前提到的强一致性方案 两阶段提交,但是在电商场景高并发下,两阶段提交持有资源时间过长并不合适。强一致性性能太低,消息队列方案由无法资源隔离,怎么办呢?TCC 方案就是为这种场景而生的。

什么是 TCC

TCC 是“Try-Confirm-Cancel”三个单词的缩写,是由数据库专家 Pat Helland 在 2007 年撰写的论文《Life beyond Distributed Transactions: An Apostate’s Opinion》中提出。一提到 TCC 我们都知道它是一种业务侵入较强的分布式事务方案,要求业务处理过程必须拆分为“try ”和“ confirm/cancel”两个阶段,并且需要分别提供这两个阶段所涉及三个步骤的接口。

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

  • Confirm :确认执行阶段,不进行任何业务检查,直接使用 Try 阶段准备的资源来完成业务处理(也就是说业务上理论一定可以执行成功)。由于分布式环境下的不可靠性,Confirm 阶段可能会重复执行,因此本阶段所执行的操作需要具备幂等性。

  • Cancel:取消执行阶段,释放 Try 阶段预留的业务资源。由于分布式环境下的不可靠性,Cancel 阶段可能会重复执行,也需要满足幂等性。

具体时序图如下:

616763254a445e9ae55351b5a50ea91f.png

这三个阶段的特点如下:

流程特点
Try预留业务资源(不锁定资源,独立事务)
Confirm确认提交资源(需要重试,最终一致性)
Cancel释放资源(需要重试,最终一致性)

如何解决前文两个问题

订单状态不更新问题

第一个问题,如何解决扣款成功订单状态迟迟不更新:

  1. 如果采用TCC方案,首先本地创建事务,生成事务 ID,记录在活动日志中,此时状态为Try。

  2. 订单在扣款和通知订单状态变更会在Try阶段进行检查,首先在用户的余额系统锁定订单金额,然后通知订单状态变为支付待确认。

  3. 如果订单库此时写入不可用,那么Try阶段订单服务会失败,活动日志状态变更为 Cancel。

  4. 进入Cancel阶段后,余额服务将锁定的金额释放,通知订单支付不成功,如果任意环节失败,可以用最终一致性方案不断尝试。

这样,上述问题通过余额回退的方式得到化解。

超卖问题

第二个问题,如何解决电商超卖的问题:

  1. 用户发起支付请求,购买一瓶可乐。

  2. 创建事务,生成事务 ID,记录在活动日志中,进入 Try 阶段:

    余额服务尝试锁定金额,库存服务尝试锁定库存资源。两者有任意失败或者接口超时活动日志的状态记录为 Cancel,将进入 Cancel阶段;全部成功则进入 Confirm 阶段,活动日志的状态记录为 Confirm。

  3. Confirm 阶段,说明Try全部成功:余额服务执行扣减金额,库存执行扣减库存。

    Confirm 阶段如果全部完成,事务正常结束。如果任何一个环节出现异常,不论是业务异常或者网络异常,都将根据活动日志中的记录,重复执行该服务的 Confirm 操作,实现最终一致。

  4. Cancel 阶段,说明Try 阶段有服务超时或者执行失败:撤销用户被锁定的金额,解锁被占用的库存。

    Cancel 阶段如果全部完成,事务以执行回滚结束。如果在 Cancel 时任意服务超时或者失败,都将根据活动日志中的记录,重复执行该服务的 Cancel 操作,实现最终一致性。

假设可乐只剩 1 瓶,因为我们在第 Try 阶段首先执行余额锁定和库存扣减,如果用户A扣款成功,并且锁定库存成功,此时可乐的可购买库存为0。当用户B并发购买,即使余额锁定成功,但是检查库存时发现已经库存不足,将通知余额解锁金额,超卖问题由此解决。

7de9b0cbfc155b32051f5ce65f9faa15.png

TCC与2PC对比

正因为 TCC 也分为了 Try 和 Confirm/Cancel 两个阶段,所以很多人对此和两阶段提交产生了混淆,这里用两个表格列出他们的异同。

相同:

TCC两阶段提交
可分为 Try 和 Confirm/Cancel 两个阶段可以分为投票阶段和提交阶段 两个阶段
在Try阶段占用资源在第一阶段占用资源

不同:

TCC两阶段提交
实现了最终一致性刚性事务,实现了强一致性
服务的代码逻辑层面实现,需要对三种操作分别编码,有业务侵入,开发成本更高底层数据库支持两阶段协议,无业务侵入
第一阶段,Try 阶段会直接提交事务,只会短暂持有资源锁,性能较高第一阶段会持续锁定资源并持有锁,事务不提交,造成服务阻塞,性能低
第二阶段的 Confirm 和 Cancel 如果出现失败,会利用最终一致性方案不断重试第二阶段如果有失败,会造成系统之间的数据不一致
TCC 的每个步骤在数据库层面都是一个独立事务两阶段的两个步骤和起来是一个完整的事务

适用场景

说了这么多,我们应该在什么场景下使用 TCC 呢?我做了些总结。

  1. 当常规最终一致性方案无法满足,需要更强的一致性。

  2. 当业务对实时性要求高。

  3. 当业务涉及到资源争夺,需要更高的隔离性。

  4. 当业务在满足一致性和隔离性的时候,还需要更好的性能表现。

当你的业务遇到这些问题的时候,那就可以考虑TCC了,比如涉及到资金数据,银行业务,金融业务,涉及到交易、支付、账务都可以考虑。

但是上述优点都是有代价的,TCC 对于业务的侵入性非常强,业务逻辑的每个分支都需要实现try、confirm、cancel三个操作。难度也比较大,需要根据不同的失败原因实现不同的回滚策略,有更高的开发成本和更换事务实现方案的替换成本。我们可以基于某些分布式事务中间件(譬如阿里开源的Seata)去完成,尽量减轻一些编码工作量。

加入讨论群是升职加薪第一步!

回复:加群

1871d2d76b1948d863a79edb69e2638b.jpeg

点赞是一种美德,如对您有帮助,欢迎评论和分享,感谢阅读!

从二叉查找树到B*树,一文搞懂搜索树的演进!|金三银四系列

2023-03-25

7329a1e40d0496650488329ad69adcce.jpeg

面试官:会SQL调优,那你知道索引合并吗?|金三银四系列

2023-03-21

0c340c68bf40411c50c13b9e7810efbe.jpeg

面试官:你是如何预防多线程死锁的?|金三银四系列

2023-03-16

4b0817ab0bc039d1942e47bf9bcdb9f4.jpeg

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

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

相关文章

百度再掀智能手机风云:推出小度AI智能手机

我是卢松松,点点上面的头像,欢迎关注我哦! 太突然了!百度进军手机市场,据报百度也要进军手机市场了。5月底发布首款AI智能手机。目前这款新机处于发布前的最后准备阶段。 这款智能手机将采用百度的AI技术,预计会具备…

react如何渲染包含html标签元素的字符串

如何渲染包含html标签元素的字符串 最近有个搜索替换的需求,用户可以输入关键字信息来匹配出对应的数据,然后对其关键字进行标记显示,如下图所示: 实现上面的需求的思路就是前端去判断检索内容,将内容中对应的关键字…

又失眠了!

下班晚,洗漱之后,就这个点了,睡不着,爬上来和大家随意 BB 几句。 一个人成长的过程,也是自我认同感不断增强的过程,在这个过程中,一个稳定的精神内核不断夯实,你不会为谁的贬低而诚惶…

Linux性能监控与调优工具

Linux性能监控与调优工具 文章目录 Linux性能监控与调优工具1.使用top、 vmstat、 iostat、 sysctl等常用工具2.使用高级分析手段, 如OProfile、 gprof4.使用LTP进行压力测试5.使用Benchmark评估系统 除了保证程序的正确性以外, 在项目开发中往往还关心性…

体验讯飞星火认知大模型,据说中文能力超越ChatGPT

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…

Nature | 生成式人工智能如何构建更好的抗体

疫情高峰期,研究人员竞相开发一些首批有效的COVID-19治疗方法:从已经康复的人的血液中分离出来的抗体分子。 现在,科学家已经证明,生成式人工智能(AI)可以通过一些繁琐的过程提供捷径,提出增强抗…

代码随想录算法训练营day29 | 491.递增子序列,46.全排列,47.全排列 II

代码随想录算法训练营day29 | 491.递增子序列,46.全排列,47.全排列 II 491.递增子序列解法一:回溯(map进行数层去重)解法二:回溯(仅针对本题,不具有普适性) 46.全排列解法…

有一说一,这是我看到的全网最新最全的SpringBoot后端接口规范了

一、前言 一个后端接口大致分为四个部分组成:接口地址(url)、接口请求方式(get、post等)、请求数据(request)、响应数据(response)。虽然说后端接口的编写并没有统一规范…

一个.Net功能强大、易于使用、跨平台开源可视化图表

可视化图表运用是非常广泛的,比如BI系统、报表统计等。但是针对桌面应用的应用,很多报表都是收费的,今天给大家推荐一个免费.Net可视化开源的项目! 项目简介 基于C#开发的功能强大、易于使用、跨平台高质量的可视化图表库&#…

Shiro 入门概述

目录 是什么 为什么要用 Shiro Shiro 与 SpringSecurity 的对比 基本功能 原理 是什么 Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完 成:认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松 地保护…

Linux 中的文件锁定命令:flock、fcntl、lockfile、flockfile

在 Linux 系统中,文件锁定是一种对文件进行保护的方法,可以防止多个进程同时访问同一个文件,从而导致数据损坏或者冲突。文件锁定命令是一组用于在 Linux 系统中实现文件锁定操作的命令,它们可以用于对文件进行加锁或解锁&#xf…

直击中国国际金融展:实在智能携多项科技成果亮相,展现数字金融力量

4月25日-27日,中国国际金融展于北京首钢会展中心成功举办。作为我国规格最高、历史最久的金融科技展,本次展会以“荟萃金融科技成果,展现数字金融力量,谱写金融服务中国式现代化新篇章”为主题,吸引了众多国内金融机构…

企业邮箱选购,需关注哪些重要因素?

企业邮箱选择考虑哪些问题?应该从企业邮箱安全、企业邮箱的稳定性、企业邮箱专业、方便迁移到新的企业邮箱、企业邮箱邮件的到达率、功能强大的企业邮箱、企业邮箱手机客户端设置等方面考虑。 1.企业邮箱安全 企业邮箱应考虑病毒防治能力。Zoho Mail企业邮箱从物理安…

华硕笔记本系统更新后开机自动蓝屏怎么U盘重装系统?

华硕笔记本系统更新后开机自动蓝屏怎么U盘重装系统?有用户将自己的华硕笔记本进行系统升级之后,遇到了开机自动蓝屏的情况。遇到这个问题我们怎么去进行解决呢?接下来一起来看看怎么通过U盘重装系统的方法解决此问题吧。 准备工作&#xff1a…

【计算机组成原理】第五章 中央处理器

系列文章目录 第一章 计算系统概论 第二章 运算方法和运算器 第三章 多层次的存储器 第四章 指令系统 第五章 中央处理器 第六章 总线系统 第七章 外围设备 第八章 输入输出系统 文章目录 系列文章目录前言第五章 中央处理器5.1 CPU功能和组成5.1.1 CPU的功能5.1.2 CPU的基本…

中文修改润色平台-中文写作润色软件有哪些

中文语言润色软件 中文语言润色软件是一种基于自然语言处理技术,旨在提高中文文本的语言风格、表达能力和可读性的工具。中文语言润色软件可以自动检测和纠正文本中出现的语法、拼写、标点符号以及其他笔误等语言问题,并给出相应的纠正建议和修改意见。…

2022年5月、11月网络工程师真题详解

请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 2022年5月网络工程师科目二真题 试题一: 某分支机构网络拓扑图如 1-1 所示,该网络通过 BGP 接收总部网络路由,设备 1 与设备…

AIGC产业研究报告 2023——音频生成篇

易观:今年以来,随着人工智能技术不断实现突破迭代,生成式AI的话题多次成为热门,而人工智能内容生成(AIGC)的产业发展、市场反应与相应监管要求也受到了广泛关注。为了更好地探寻其在各行业落地应用的可行性…

实战【7】手把手教你搭建属于自己的服务器

1 概述 最近总是想搭建自己的网站,奈何皮夹里空空如也,服务器也租不起,更别说域名了。于是我就寻思能否自己搭建个服务器,还不要钱呢? 经过几天的冲浪,我发现有两个免费的建站工具:Apache 和 …

MySQL 索引、事务与存储引擎

MySQL 索引 索引:根据查询字段在索引表中找到该行数据的物理地址。 作用:加快查询速度;排序。 缺点:占用额外的磁盘空间;更新一个包含索引的表需要花费更多的时间。 创建索引的原则 表的主键和外键需要索引&#…