前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >TCC的异常场景及应对机制

TCC的异常场景及应对机制

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

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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深度剖析 Seata TCC 模式【图解 + 源码分析】
Seata 目前支持 AT 模式、XA 模式、TCC 模式和 SAGA 模式,之前文章更多谈及的是非侵入式的 AT 模式,今天带大家认识一下同样是二阶段提交的 TCC 模式。
张乘辉
2022/01/24
2.7K0
深度剖析 Seata TCC 模式【图解 + 源码分析】
TCC 分布式事务解决方案
TCC 是Try、Confirm、Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try、确认Confirm、撤销Cancel。Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与 Try或者 Commit相反的操作即回滚操作。TM首先发起所有的分支事务的 try操作,任何一个分支事务的 try操作执行失败,TM将会发起所有分支事务的 Cancel操作,若 Try操作全部成功,TM将会发起所有分支事务的 Confirm操作,其中 Confirm/Cancel 操作若执行失败,TM会进行重试。
Java架构师必看
2021/05/14
1.2K0
TCC 分布式事务解决方案
分布式事务XA、AT、TCC、SAGA
假设系统中有3个服务,分别是订单服务、账户服务、库存服务,用户在下一个订单之后会扣除用户的余额,同时扣减库存容量。在这样的场景下扣款和扣库存需要强一致性保证。就可能会使用到分布式事务解决方案。
benym
2022/07/14
3.9K0
分布式事务XA、AT、TCC、SAGA
分布式事务方案 - TCC
TCC是支付宝提出的分布式事务解决方案,是 try、confirm、cancel 的缩写。
dys
2019/07/31
2K0
分布式事务方案 - TCC
阿里是如何处理分布式事务的
分布式事务中的TCC模式,貌似是阿里提出来的,所以阿里自研的分布式事务框架总是少不了TCC的影子。
春哥大魔王
2019/05/15
1.2K0
阿里是如何处理分布式事务的
分布式事务解决方案之TCC(Hmily)「建议收藏」
TCC是Try、Confirm、Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try、确认Confirm、撤销Cancel。Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与Try相反的操作即回滚操作。TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发起所有分支事务的Cancel操作,若try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Confirm/Cancel操作若执行失败,TM会进行重试。
全栈程序员站长
2022/08/26
3.5K0
分布式事务解决方案之TCC(Hmily)「建议收藏」
分布式事务最经典的八种解决方案
分布式事务最经典的八种解决方案 随着业务的快速发展、业务复杂度越来越高,几乎每个公司的系统都会从单体走向分布式,特别是转向微服务架构。随之而来就必然遇到分布式事务这个难题。
猫头虎
2024/04/08
7.9K0
分布式事务最经典的八种解决方案
25. Seata 介绍及四种模式优缺点
Seata(Simple Extensible Autonomous Transaction Architecture)是一个开源的分布式事务解决方案,旨在解决分布式系统中的事务一致性问题。它为开发者提供了一种简单而可扩展的方式来管理和协调分布式事务。
AI码师
2023/12/15
3K0
25. Seata 介绍及四种模式优缺点
分布式事务最经典的七种解决方案
随着业务的快速发展、业务复杂度越来越高,几乎每个公司的系统都会从单体走向分布式,特别是转向微服务架构。随之而来就必然遇到分布式事务这个难题,这篇文章总结了分布式事务最经典的解决方案,分享给大家。
程序员的时光001
2021/08/06
4680
分布式事务最经典的七种解决方案
分布式事务之解决方案(TCC)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/12/03
6.3K0
分布式事务之TCC服务设计和实现
TCC是服务化的两阶段编程模型,其Try、Confirm、Cancel 3个方法均由业务编码实现;
Bug开发工程师
2018/08/03
1.7K0
分布式事务之TCC服务设计和实现
TCC分布式事务的设计、实现与示例
Pat Helland于2007年发表tcc论文《Life beyond Distributed Transactions: an Apostate’s Opinion》,提出了TCC的概念,在论文中,TCC还是以Tentative-Confirmation-Cancellation命名的,后来Atomikos公司改名为Try-Confirm-Cancel。
用户6879030
2024/06/05
1920
TCC分布式事务的设计、实现与示例
分布式事务TCC模式的空回滚和业务悬挂问题
TCC模式与AT模式非常相似,每阶段都是独立事务,不同的是TCC通过人工编码来实现数据恢复。需要实现三个方法:
benym
2022/07/14
7.2K0
分布式事务TCC模式的空回滚和业务悬挂问题
saga分布式事务_本地事务和分布式事务
2PC,两阶段提交,将事务的提交过程分为资源准备和资源提交两个阶段,并且由事务协调者来协调所有事务参与者,如果准备阶段所有事务参与者都预留资源成功,则进行第二阶段的资源提交,否则事务协调者回滚资源。
全栈程序员站长
2022/10/05
2.9K0
saga分布式事务_本地事务和分布式事务
XA规范与TCC事务模型
XA 是由 X/Open 组织提出的分布式事务规范,XA 规范主要定义了事务协调者(Transaction Manager)和资源管理器(Resource Manager)之间的接口。
JAVA日知录
2020/05/13
2.4K0
XA规范与TCC事务模型
Hmily实现TCC事务控制
通过本案例的学习,掌握Hmily实现TCC事务控制的方法,掌握TCC事务控制的思想。
全栈程序员站长
2022/08/31
3700
Hmily实现TCC事务控制
分布式事务解决方案
什么是分布式事务?此时我我们需要了解一下什么是本地事务;说到本地事务此时我们就需要谈一下什么是事务以及以下几种概念。 事务: 百度百科是这样说的事务(Transaction) 一般是指要做的或所做的事
@派大星
2023/06/28
2630
分布式事务解决方案
分布式事务
在分布式系统中,多个服务配合完成一个流程,不同服务执行结果不一定都成功,这时候就会产生问题。比如订单微服务和库存微服务,下单的同时订单微服务请求库存微服务减库存, 如果订单服务执行成功,但是库存服务执行失败没有扣减库存,那么就会出现超卖现象。
羽毛球初学者
2024/10/16
1640
java分布式事务——seata,tcc解决方案总结!
我们了解到了分布式事务的基础概念。与本地事务不同的是,分布式系统之所以叫分布式,是因为提供服务的各个节点分布在不同机器上,相互之间通过网络交互。不能因为有一点网络问题就导致整个系统无法提供服务,网络因素成为了分布式事务的考量标准之一。因此,分布式事务需要更进一步的理论支持,接下来,我们先来学习一下分布式事务的CAP理论。
凯哥Java
2022/12/16
8600
java分布式事务——seata,tcc解决方案总结!
微服务痛点-基于Dubbo + Seata的分布式事务(TCC模式)
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
sanshengshui
2020/12/31
1.2K0
相关推荐
深度剖析 Seata TCC 模式【图解 + 源码分析】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档