首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >TCC的异常场景及应对机制

TCC的异常场景及应对机制

作者头像
爱撸猫的杰
发布于 2021-02-05 08:26:58
发布于 2021-02-05 08:26:58
2.6K0
举报
文章被收录于专栏:爱撸猫的杰爱撸猫的杰

TCC的异常场景

在分布式系统中,随时随地都需要面对网络超时,网络重发和服务器宕机等问题。所以分布式事务框架作为搭载在分布式系统之上的一个框架型应用也绕不开这些问题。具体而言,有以下常见问题:

  1. 幂等处理
  2. 空回滚
  3. 资源悬挂

这些异常的应对需要TCC框架的支持和解决方案。

幂等处理

产生原因

因为网络抖动等原因,分布式事务框架可能会重复调用同一个分布式事务中的一个分支事务的二阶段接口。所以分支事务的二阶段接口Confirm/Cancel需要能够保证幂等性。如果二阶段接口不能保证幂等性,则会产生严重的问题,造成资源的重复使用或者重复释放,进而导致业务故障。

从上图中红色部分可以看到:如果当TC调用参与者的二阶段方法时,发生了异常(TC本身异常或者网络异常丢失结果)。此时TC无法感知到调用的结果。为了保证分布式事务能够走到终态,此时TC会按照一定的规则重复调用参与者的二阶段方法。

应对策略

对于幂等类型的问题,通常的手段是引入幂等字段进行防重放攻击。对于分布式事务框架中的幂等问题,同样可以祭出这一利器。我们可以通过增加一张事务状态控制表来实现,这个表的关键字段有以下几个:

  1. 主事务ID
  2. 分支事务ID
  3. 分支事务状态

其中1和2构成表的联合主键来唯一标识一笔分布式事务中的一条分支事务。3用来标识该分支事务的状态,一共有3种状态:

  1. INIT(I) - 初始化
  2. CONFIRMED© - 已提交
  3. ROLLBACKED® - 已回滚

幂等记录的插入时机是参与者的Try方法,此时的分支事务状态会被初始化为INIT。然后当二阶段的Confirm/Cancel执行时会将其状态置为CONFIRMED/ROLLBACKED。

当TC重复调用二阶段接口时,参与者会先获取事务状态控制表的对应记录查看其事务状态。如果状态已经为CONFIRMED/ROLLBACKED,那么表示参与者已经处理完其分内之事,不需要再次执行,可以直接返回幂等成功的结果给TC,帮助其推进分布式事务。增加了幂等记录的写入和读取判断后,时序图如下(蓝色部分):

空回滚

产生原因

先来说定义,当没有调用参与方Try方法的情况下,就调用了二阶段的Cancel方法,Cancel方法需要有办法识别出此时Try有没有执行。如果Try还没执行,表示这个Cancel操作是无效的,即本次Cancel属于空回滚;如果Try已经执行,那么执行的是正常的回滚逻辑。

如上图所示,红色部分的一阶段Try可能失败。

首先发起方在调用参与者之前,会向TC申请开始一笔分布式事务。然后发起方调用参与者的一阶段方法,在调用实际发生之前,一般会有切面拦截器感知到此次Try调用,然后写入一条分支事务记录。紧接着,在实际调用参与者的Try方法时发生了异常。异常原因可以是发起方宕机,网络抖动等。

总而言之,就是Try方法没有执行成功,然而此时这笔分布式事务和分支事务已经落库。有两种情况会触发分布式事务的回滚:

  1. 发起方认为当前分布式事务无法成功,主动通知TC回滚
  2. TC发现分布式事务超时,被动触发回滚

触发回滚操作后,TC会对该分布式事务关联的分支事务调用其二阶段Cancel。在执行Cancel时,Try还未执行成功,触发空回滚。如果不对空回滚加以防范的话,可能会造成资源的无效释放。即在没有预留资源的情况下就释放资源,造成故障。

应对策略

可以发现,要应对空回滚的问题,就需要让参与者在二阶段的Cancel方法中有办法识别到一阶段的Try是否已经执行。

很显然,可以继续利用事务状态控制表来实现这个功能。

前面提到过为了保证幂等性,当Try方法被成功执行后,会插入一条记录,标识该分支事务处于INIT状态。所以后续当二阶段的Cancel方法被调用时,可以通过查询控制表的对应记录进行判断。如果记录存在且状态为INIT,就表示一阶段已成功执行,可以正常执行回滚操作,释放预留的资源;如果记录不存在则表示一阶段未执行,本次为空回滚,不释放任何资源。

时序图如下所示:

资源悬挂

产生原因

悬挂,顾名思义,是有一些资源被悬挂起来后续无法处理了。那么什么场景下才会出现这种现象呢?

上一节中提到过空回滚,指的是当一阶段Try未执行成功,而二阶段Cancel就因TC回滚整个分布式事务而被调用。

但是考虑一种极端情况,当分布式事务到终态后,参与者的一阶段Try才被执行,此时参与者会根据业务需求预留相关资源。预留资源只有当前事务才能使用,然而此时分布式事务已经走到终态,后续再没有任何手段能够处理这些预留资源。至此,就形成了资源悬挂。

这种一阶段比二阶段执行的还晚的情况看似不可能,但是仔细考虑RPC调用的时序,其实这种情况在复杂多变的网络中是完全可能的,下面的时序展示了这种可能性:

  1. 发起方通过RPC调用参与者一阶段Try,但是发生网络阻塞导致RPC超时
  2. RPC超时后,TC会回滚分布式事务(可能是发起方主动通知TC回滚或者是TC发现事务超时后回滚),调用已注册的各个参与方的二阶段Cancel
  3. 参与方空回滚后,发起方对参与者的一阶段Try才开始执行,进行资源预留从而形成悬挂

使用时序图来描述,红色部分为产生资源悬挂的关键步骤:

应对策略

资源悬挂的本质原因在于,一阶段和二阶段的执行顺序没有被严格地保证。所以相应的解决方案还是通过读取事务状态控制表的事务状态。

前面在幂等方案的讨论中说过:

幂等记录的插入时机是参与者的Try方法,此时的分支事务状态会被初始化为INIT。然后当二阶段的Confirm/Cancel执行时会将其状态置为CONFIRMED/ROLLBACKED。

由于悬挂的产生背景是一阶段方法根本就未执行,所以此时事务控制记录是不存在的,需要在二阶段中处理ROLLBACK的情况(因为超时后触发回滚不可能存在二阶段为CONFIRM)。

处理方案为在判断为空回滚的场景下(体现在对应一阶段事务控制记录不存在),插入一条状态为ROLLBACKED的控制记录。

那么下次当一阶段Try抵达执行的时候,首先会尝试插入状态为INIT的事务控制记录。如果插入失败,表示当前分支事务的记录已经存在,Try无需继续执行。有几种可能性会导致此情形:

  1. 一阶段Try重复请求,网络抖动情况可能发生,可以理解为命中幂等
  2. 二阶段插入了防悬挂记录,一阶段不可继续执行

时序图描述如下,蓝色部分为防止资源悬挂增加的检查项:

三种异常总结

前面讨论了分布式事务三种典型的异常类型,它们的解决方案都依赖于一张事务状态控制表。我们来尝试总结一下它们各自的特点。

幂等

问题:TC重复调用二阶段 解决:事务状态控制记录作为控制手段,只有存在INIT记录时才执行,存在CONFIRMED/ROLLBACKED记录时不再执行

空回滚

问题:TC回滚事务调用二阶段,但一阶段尚未执行 解决:事务状态控制记录作为控制手段,无记录时即为空回滚

资源悬挂

问题:TC回滚事务调用二阶段完成空回滚后,一阶段执行成功 解决:事务状态控制记录作为控制手段,二阶段发现无记录时插入记录,一阶段执行时检查记录是否存在

共通点
  1. 核心的解决方案就是事务状态控制表
  2. 幂等控制作为最基础的异常处理手段;资源悬挂的前置条件是空回滚,所以发生空回滚时会插入一条状态为ROLLBACKED的控制记录

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-02-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
新一代DevOps:集成AI以增强工作流自动化
人工智能与更广泛的 DevOps 框架的日益融合将对我们处理软件开发的方式带来重大改变。
云云众生s
2024/03/28
1.3K0
n8n - 工作流自动化
工作流自动化可以帮助组织减少人为错误,也可以释放员工的时间,让他们专注于更有价值的工作。作者之前有介绍过Postman Flows,允许你在协作环境中创建工作流、集成和自动化,而无需编写单行代码。
wangmcn
2024/12/19
17.6K0
n8n - 工作流自动化
强!54K+ star!一款解放双手,可视化自动化神器,支持400个节点!!
今天将为您介绍一款备受欢迎的自动化工具——n8n,它目前以54K+ star的高关注度在GitHub上崭露头角。
测试开发技术
2025/01/23
3.8K0
强!54K+ star!一款解放双手,可视化自动化神器,支持400个节点!!
自动化测试框架的完整指南【译】
任何成功的自动化测试过程的关键组成部分都是测试自动化框架。降低维护成本,测试工作效率提升和提高质量保证团队的投资回报率ROI是优化敏捷流程时所提供的主要优势之一。
FunTester
2021/06/23
1K0
如何应对自动化测试挑战【译】
如果实施得当,自动化测试可以为产品和系统开发项目提供高效的生产力提升和质量提升。但是,当团队刚刚开始实施时,应用最佳实践可能是一项繁琐的任务。
FunTester
2021/06/23
4340
流程自动化简化ITOps的5种方法
组织需要在流程中构建更多自动化,特别是对于像事件响应和服务管理这样的劳动密集型任务。
云云众生s
2024/06/07
1740
生成式 AI 如何支撑当前的 DevOps 和 SRE 工作体系?
Hello folks,我是 Luga,今天我们来聊一下人工智能生态核心技术—— GAI,即 “生成式人工智能” 。
Luga Lee
2023/11/07
1.4K2
生成式 AI 如何支撑当前的 DevOps 和 SRE 工作体系?
Web端自动化测试失败原因汇总
最初的测试自动化失败是从不切实际的期望中获得的。在我的职业生涯中,我已经多次观察到它,一旦您获得了自动化的质量保证或工作人员,管理层就期望他们对所有内容进行自动化测试。尽管听起来很令人愉悦,但这是不可能的。您不能进行100%的自动化测试,因为在少数几个领域必须进行人工检查。这些领域之一可能与您的Web应用程序的可访问性有关。
FunTester
2019/11/10
3.2K2
计算机程序的自动化
计算机程序的自动化是指通过编写程序来实现特定任务的自动执行。自动化程序可以根据预定义的规则和条件,自动完成一系列操作,而无需人工干预。这样可以提高工作效率,减少人力成本,并减少错误发生的可能性。
明志德道
2023/11/17
3080
自动化测试入门:是什么,流程,收益和工具
http://mpvideo.qpic.cn/0bf2jeaaiaaa3eaeb6fj3vpfasodareqabaa.f10002.mp4?dis_k=cc04b07c621debb660c5902
归根落叶
2020/05/15
1.7K0
自动化测试入门:是什么,流程,收益和工具
IT自动化
IT自动化对创建重复过程的说明加以使用,该过程取代了IT专业人员在数据中心和云部署中的手动工作。软件工具,框架和设备以最少的管理员干预执行任务。IT自动化的范围从单个动作到离散序列,最终到一个自主的IT部署,该部署基于用户行为和其他事件触发来采取措施。
知行软件EDI
2021/01/25
7970
IT自动化
工作流自动化是什么?为什么要用低代码实现工作流自动化?
在数字化转型浪潮中,企业不断寻求创新的方法来提升运营效率,优化工作流程,而低代码平台的出现,无疑为这一进程增添了新的动力。尤其是当提及工作流自动化时,低代码技术以其独特的优势,正逐渐成为企业加速转型、拥抱数字化的首选工具。
Zoho Creator低代码
2024/07/05
3560
企业级低代码中“自动化工作流”的5大优势!
如果你的企业还在因为陈旧的流程而感到烦恼,那首先我得告诉你,你并不是第一个经历这类问题的人。目前为止,依旧有很多企业正在因为过多的手动任务、繁琐的工作流程、工作协同沟通障碍等问题而感到束手无策。
informat低代码
2022/10/12
6340
企业级低代码中“自动化工作流”的5大优势!
自动化的10项准备工作
软件或应用程序的测试工作和开发人员创建软件的工作同样重要。有时候,软件测试可能被忽视,但它对于公司来说是至关重要的,可以避免不必要的尴尬和金钱损失。软件测试通常需要进行重复的测试,因为任何人为的错误都可能影响测试结果。为了避免这样的错误,如今大多数公司选择将测试自动化与DevOps相结合。这意味着每次向现有代码库添加新代码时,测试人员不再需要重复相同的步骤和操作,也不需要重新从头开始测试软件。通过使用诸如 Selenium 这样的软件,自动化测试变得越来越受欢迎。
FunTester
2024/01/17
2540
自动化的10项准备工作
云计算自动化如何成为构建成功的DevOps功能的关键
为了真正实现业务运营的敏捷性和效率,企业需要缓解IT运营和开发这两个团队之间的紧张关系,可以通过名为“DevOps”的实践将运营团队和开发团队整合在一起。DevOps的成功很大程度上取决于现有的技术和工具以增强团队能力。例如,得到云计算支持的基础设施即代码(IaC)如今已经成为减少DevOps人工任务,并腾出更多时间来构建软件的出色工具。
静一
2021/06/01
4060
从手动测试到自动化测试(下)
对于初学者来说,重要的是要记住自动化测试并不是适用于所有测试场景的灵丹妙药。但是,通过注意下面描述的以下几点,可以选择要自动化和不自动化的内容:
FunTester
2022/12/09
3460
java中jbpm工作流_状态机和工作流的区别
BPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。jBPM是公开源代码项目,使用它要遵循 ASL(Apache License Version 2.0)和EULA(JBoss End User License Agreement)协议。
全栈程序员站长
2022/09/30
1.6K0
java中jbpm工作流_状态机和工作流的区别
使用这些DevOps流水线降低自动化工具成本
许多IT组织使用许可的自动化工具,但为所有QA和开发人员提供许可证是不切实际的。通常,许可证分配给指定的自动化工程师,他们根据需要创建和运行测试。这给任何团队成员按需执行测试带来了挑战。由于大多数自动化工程师都在海外,因此需要额外的许可证用于本地测试执行,这可能非常昂贵。此外,确保高质量的代码、足够的覆盖率、没有代码异味以及彻底的安全扫描至关重要。
云云众生s
2024/11/26
1680
使用这些DevOps流水线降低自动化工具成本
自动化测试的障碍
业内专家认为,具有人工测试的企业文化是阻碍自动化测试进展的最大障碍。为了收集当前和未来自动化测试状态的见解,我们询问了来自27家公司的31位高管,“您认为阻碍自动化测试的最常见问题是什么?”
FunTester
2019/09/05
6480
云计算自动化对于虚拟化环境意味着什么?
IT运营和网络实践的现代化导致自动化和计算技术和工具的快速采用。云计算自动化对于成功过渡到利用云计算基础设施至关重要,并且可以包括自动存储和备份、管理安全性和合规性、更改配置和设置,以及部署代码等任务。根据AiThority公司对2021年的IT行业预测,组织将越来越多地使用云计算和自动化工具来满足其数字化转型的目标和要求。
静一
2021/02/22
4180
推荐阅读
相关推荐
新一代DevOps:集成AI以增强工作流自动化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档