分布式事务解决方案(最终一致性【TCC解决方案】)

最终一致性分布式事务概述

        强一致性分布式事务解决方案要求参与事务的各个节点的数据时刻保持一致,查询任意节点的数据都能得到最新的数据结果,这就导致在分布式场景,尤其是高并发场景下,系统的性能受到了影响。而最终一致性分布式事务解决方案并不要求参与事务的各个节点数据时刻保持一致,运行其存在中间状态,只要一段时间后,能够达到数据的最终一致状态即可,在电商场景中使用比较多

典型方案

业界基于Base理论提出的最终一致性分布式事务解决方案有:

  • TCC解决方案
  • 可靠消息最终一致性解决方案
  • 最大努力通知型解决方案

优缺点

最终一致性分布式事务解决方案的优点

  • 性能比较高,这是因为最终一致性分布式事务解决方案不要求数据时刻保持一致,不会因为长时间持有事务占用的资源而过度消耗过多的性能
  • 具备可用性
  • 适合高并发场景

最终一致性分布式事务解决方案的缺点:

  • 因为数据存在短暂的不一致,所以在某个时刻查询出的数据状态可能会不一致
  • 对于事务一致性要求特别高的场景不适用

服务模式

  • 可查询操作:需要服务操作具有可标识性,主要体现在服务的操作具有全局唯一的标识,可以是业务的单据编码(如订单号)也可以是系统分配的操作流水号,另外在可查询的服务模式中,也要有完整的操作时间信息
  • 幂等性操作:指对同一个方法,只要参数相同,无论执行多少次都与第一次执行时产生的影响相同,为了保证数据的最终一致性,系统会提供很多次重试操作,这个时候就需要接口实现幂等性操作
  • TCC操作:这个模式下包括了3个阶段,Try阶段(尝试业务执行)、Confirm阶段(确认业务阶段)和cancel阶段(取消业务执行)

Try阶段

  1. 完成所有业务的一致性检查
  2. 预留必要的业务资源,并需要与其他操作隔离

Confirm阶段

  1. 此阶段会真正执行业务操作
  2. 因为在Try阶段完成了业务的一致性检查,所有此阶段不会做任务业务检查
  3. 只用Try阶段预留的业务资源进行操作
  4. 此阶段的操作需要满足幂等性

Cancel阶段

  1. 释放Try阶段预留的业务资源
  2. 此阶段的操作需要满足幂等性
  • 可补偿操作:某些数据处于不正常的状态,需要通过某种方式进行业务补偿,使数据能够达到最终一致性,这种因数据不正常而进行的补偿操作,就是可补偿操作服务模式

TCC解决方案

        TCC是一种典型的解决分布式事务问题的方案,主要解决跨服务调用场景下得分布式事务问题,广泛应用于分布式事务场景

适用场景

        用于具有强隔离性,严格一致性要的业务场景,也适用于执行时间比较短的业务,对于电商场景中下得减库存等业务,如果使用TCC分布式事务,则会经历Try、Confirm、Cancel三个阶段

需要实现的服务模式

        在TCC分布式事务解决方案中,需要实现的服务模式包括TCC操作,幂等操作、可补偿操作、可查询操作。

        例如实现TCC分布式事务方案时,需要实现Try、Confirm、Cancel三个阶段的业务逻辑,这就是TCC操作,在TCC操作的每个阶段的方法都需要实现幂等性,这就是幂等操作,如果在执行分布式事务过程中业务服务出现了异常情况,则需要支持重试阶段,以达到事务补偿的目的,这就是可补偿操作,另外业务服务需要提供可以查询自身内部事务状态的接口,以供其他服务调用,这就是可查询操作

分支事务失败的情况:

本质上讲,TCC是一种应用层实现的二阶段提交协议,TCC方案的执行流程如下

  • Try阶段:不会执行任务业务逻辑,仅做业务的一致性检查和预留相应的资源,这些资源能够和其他操作保持隔离
  • confirm阶段:当Try阶段所有分支事务执行成后开始执行Confirm阶段,通常情况下,采用TCC解决分布式事务时会任务Confirm阶段是不会出错的,也就是说,只要Try阶段的操作执行成功了,Confirm阶段就一定会执行成功,如果Confirm阶段出错了,就需要引入重试机制或者人工处理,对出错的事务进行干预
  • Cancel阶段:在业务执行异常或出现错误的情况下,需要回滚事务的操作,执行分支事务的取消操作,并且释放Try阶段预留的资源,通常情况下,采用TCC方法解决分布式事务时,同样会认为Cacnel阶段也是一定会执行成功的,如果出现错误,就需要引入重试机制或者人工处理,对出错的事务进行干预

方案的优缺点

TCC方案的优点

  • 在应用层实现具体的逻辑,锁定资源的粒度变小,不会锁定所有资源,提升了系统的性能
  • Confirm阶段和Cancel阶段的方法具备幂等性,能够保证分布式事务执行完毕后数据的一致性
  • TCC分布式解决方案有主业务发起整个事务,无论主业务还是分支事务所在的业务,都能部署为集群模式,从而解决了XA规范的单点故障问题

TCC方案的缺点

  • 代码需要耦合到业务中,每个参与分布式事务的业务方法都要拆成Try、Confirm、Cancel三个阶段的方法,提高了开发的成本

需要注意的问题

        使用TCC方案解决分布式事务问题时,需要注意空回滚、幂等和悬挂问题

空回滚问题

  • 原因:出现空回滚的原因是一个分支事务所在的服务器宕机或者网络发生异常,此分支事务调用失败,此时并未执行此分支的Try阶段的方法,当服务器或者网络恢复后,TCC分布式事务执行回滚操作,会调用分支事务的Cancel阶段的方法,如果Cancel阶段的方法不能处理这种情况,就会出现空回滚的问题
  • 解决方案:识别是否出现空回滚操作的方法是判断是否执行了Try阶段的方法,如果执行了Try阶段的方法,就没有空回滚,否则则出现空回滚

幂等问题

  • 原因:由于服务器宕机、应用崩溃或者网络异常等原因,可能会出现方法调用超时的情况,为了保证方法的正常执行,往往会在TCC方案中加入超时重试机制,因为超时重试有可能导致数据的不一致问题,所以需要保证分支事务的执行以及TCC方案的Confirm阶段和Cancel阶段具备幂等性
  • 解决方案:在分支事务记录表中增加事务的执行状态,每次执行分支事务以及Confirm阶段和Cancel阶段的方法时,都查询次事务的执行状态,以此判断事务的幂等性

悬挂问题

  • 原因:TCC分布式事务中,通过RPC调用分支事务Try阶段的方法时,会先注册分支事务,在执行RPC调用。如果此时发生服务器宕机,应用崩溃或者网络异常等情况,RPC调用就会超时,如果RPC调用超时,事务管理器会通知对于的资源管理器回滚事务,可能资源管理器回滚完事务后,RPC请求达到了参与分支事务所在的业务方法,因为此时事务以及回滚,所以在Try阶段预留的资源就无法释放了,这种情况下,就成为悬挂
  • 解决方案:如果执行了Confirm阶段或者Cancel阶段的方法,则Try阶段的方法就不能再执行了,具体方案是在执行Try阶段的方法时,判断分支记录表中是否存在同一全局事务下Confirm阶段或者Cancel阶段的事务记录,如果存在,则不执行Try阶段的方法

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

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

相关文章

Solana 验证节点搭建教程 SOL节点

搭建验证节点 (成功下载快照) 部署 Solana 验证节点 由于项目需求,需要部署一台solana节点,我们从一开始搭建,遇到许多坑,做个记录。 一定要注意服务器配置,配置不够,rpc启动不起来。 一、简介 官网地址…

OpenHarmony 实战开发——ArkUI中的线程和看门狗机制

一、前言 本文主要分析ArkUI中涉及的线程和看门狗机制。 二、ArkUI中的线程 应用Ability首次创建界面的流程大致如下: 说明: • AceContainer是一个容器类,由前端、任务执行器、资源管理器、渲染管线、视图等聚合而成,提供了生…

产品经理-流程图结构图(四)

1. 流程图 1.1 概念 为了达到特定的目标而进行的一系列有逻辑性的操作步骤,由两个及以上的步骤,完成一个完整的行为的过程,可称之为流程 1.2 产品经理为什么需要绘制流程图? 保证产品的使用逻辑合理顺畅向项目组其他成员清晰的…

3.5 四个子空间的维度

一、概述 这一节的主要定理是将秩与维度联系在一起。矩阵的秩就是主元的个数,子空间的维度是基向量的个数,我们计算出这两个数就可以得到秩与维度。 A A A 的秩揭露了四个基本子空间的维度。 四个子空间中,两个子空间来自 A A A&#xff0c…

2024年蓝桥杯B组C++——复盘

1、握手问题 知识点:模拟 这道题很简单。但是不知道考试的时候有没有写错。一开始的43个人握手,仅需要两两握手,也就是从42个握手开始,而非43.很可惜。这道题没有拿稳这5分。也很有可能是这5分导致没有进决赛。 总结&#xff1a…

jQuery事件导读+其它方法

jQuery 事件导读一、事件注册二、事件处理1.内容2.例子,微博绑定事件3.off解绑事件4.自动触发事件 三、事件对象 其他方法一、拷贝对象二、多库共存三、插件 事件导读 一、事件注册 单个事件叫注册,多个事件叫处理 二、事件处理 1.内容 2.例子&#…

每天五分钟深度学习框架pytorch:tensor张量的维度转换大全

本文重点 在深度学习中比较让人头疼的一点就是矩阵的维度,我们必须构建出符合神经网络维度的矩阵,只有将符合要求的矩阵放到神经网络中才可以运行神经网络,本节课程我们将学习以下tensor中维度的变化。 view和shape View和shape,这两个方法可以完成维度的变换操作,而且使…

Windows操作系统基本知识整理

目录 引言 一、Windows操作系统的发展历史 1.1 Windows 1.0到Windows 3.0 1.2 Windows 95到Windows Me 1.3 Windows NT到Windows 2000 1.4 Windows XP到Windows 7 1.5 Windows 8到Windows 10 二、Windows操作系统的核心组件 2.1 内核 2.2 文件系统 2.3 图形用户界面&…

Android 系统日志(Log) JNI实现流程源码分析

1、JNI概述 Java Native Interface (JNI) 是一种编程框架,使得Java代码能够与用其他编程语言(如C和C)编写的本地代码进行交互。JNI允许Java代码调用本地代码的函数,也允许本地代码调用Java代码的函数。下面是对JNI机制的详细概述…

kettle学习之表的输入输出

需求 把表A里的数据传送到表B中,在此之前,清空表B内的数据 表输入 执行SQL脚本 表输出

Qt 5前后调色板差异变化

Qt 5之前: QPalette palette;//调色板 设置背景颜色 palette.setColor(QPalette::Backgound, color...);Qt 5之后: 由原有的 Background 模式 更新为 Window 模式 QPalette palette;//调色板 设置背景颜色 palette.setColor(QPalette::Window, color..…

STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距

一、模块资料 (1)模块简介 超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等特点。HC-SRO4是一款尺寸完全兼容老版本,增加UART和IIC功能的开放式超声波测距模块,默认条件下,软件…

Android Gradle plugin 版本和Gradle 版本

1.当看到这两个版本时,确实有点迷糊。但是他们是独立的,没有太大关联。 就是说在Android studio中看到的两个版本信息,并无太大关联,是相互独立的。Gradle插件版本决定了你的项目是如何构建的,而Gradle版本是执行构建…

知识融合概述

文章目录 知识融合知识融合过程研究现状技术发展趋势 知识融合 知识融合的概念最早出现在1983年发表的文献中,并在20世纪九十年代得到研究者的广泛关注。而另一种知识融合的定义是指对来自多源的不同概念、上下文和不同表达等信息进行融合的过程认为知识融合的目标是…

新闻稿推广策略有哪些?建议收藏

新闻稿推广是一种有效的公关工具,它可以帮助企业或组织传递信息、提升品牌知名度、建立权威形象,并最终促进销售。新闻稿推广策略有哪些?接下来伯乐网络传媒就来给大家分享一下。 确定目标受众:在撰写新闻稿之前,明确你…

对比表征学习(二)Setence Embedding

参考翁莉莲的Blog,本章主要阐述句子嵌入(sentence embedding) 文本扩增 绝大部分视觉应用中的对比方法依赖于创造每个图像的增强版本,但是在句子扩增中会变得非常有挑战性。因为不同于图片,在扩增句子的同时非常容易改…

TPD-3W 系列——3W 1.5KVDC 隔离 宽范围输入,双隔离双输出 DC/DC 电源模块

TPD-3W系列产品是专门针对线路板上分布式电源系统中需要产生一组与输入电源隔离的双隔离双电源的应用场合而设计。该产品适用于:1)输入电源的电压变化范围≤2:1 ;2)输入输出之间要求隔离≤1500VDC;3&#x…

从零开始搭建一个SpringBoot项目

目录 Spring BootSpring Boot 项目开发环境1、快速创建SpringBoot项目2、pom.xml 添加 Meavn 依赖3、配置application.yml4、验证数据库是否连接成功5、配置 Druid 数据源 Spring Boot 整合 MyBatis1、准备依赖2、application-dev.yml 配置3、启动类添加Mapper接口扫描器4、设置…

【C++】:vector容器的基本使用

目录 🍒1,vector的介绍🍒2,vector的使用🐯2.1 vector的构造🦁2.2 vector iterator 的使用🌽2.3 vector 空间增长问题🍓2.4 vector 增删查改🐯2.5 vector 访问及遍历&…

2024新数据库入门教程

1.官网下载MySQL 下载Mysql链接: 点击下载mysql 下载完成后解压到某一个文件夹(记住这个路径,一会要用到) 2.配置初始化文件my.ini 在根目录下创建一个txt文件,名字叫my,文件后缀为ini 以下代码除安装目录和数…