分布式事务解决方案(最终一致性【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阶段的方法

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

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

相关文章

第十七届全国大学生信息安全竞赛创新实践能力赛初赛部分复现

Misc 神秘文件 1.根据提示信息,均需要从ppt中提取信息 2.在ppt的属性中发现一串密文和key,解密之后得到第一部分,根据提示Bifid chipher,为双歧密码解密,使用Bifid Cipher Decode解码 3.在第五张幻灯片,…

【python】python商家会员数据分析可视化(源码+数据集+课程报告论文)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

Midjourney应用场景、特点、生成图片带来影响

Midjourney是一个基于GPT-3.5系列接口开发的免费AI机器人,旨在提供多领域的智能对话服务。本文主要介绍Midjourney的应用场景、功能特点、图片生成后可以做什么? 一、Midjourney应用场景 Midjourney的应用场景相当广泛,以下是一些主要的适用…

单链表OJ题(课堂总结)

1.链表的带环问题 上图就是一个典型的带环链表 1.1如何判读链表是否带环? 最常见的方法就是利用快慢指针,快指针追加慢指针,当二者相等的时候即可判断链表带环 其实现的代码如下: bool hasCycle(struct ListNode*head) { s…

nuxt2:自定义指令 / v-xxx / directives / 理解 / 使用方法 / DEMO

一、理解自定义指令 在 vue 中提供了一些对于页面和数据更为方便的输出&#xff0c;这些操作就叫做指令&#xff0c;以 v-xxx 表示&#xff0c;比如 html 页面中的属性 <div v-xxx ></div>。自定义指令很大程度提高了开发效率&#xff0c;提高了工程化水平&#x…

通过键值对访问字典

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;如果想将字典的内容输出也比较简单&#xff0c;可以直接使用print()函数。例如&#xff0c;要想打印dictionary字典&#xff…

【ARMv8/v9 异常模型入门及渐进 10 -- WFI 与 WFE 使用详细介绍 1】

请阅读【ARMv8/v9 ARM64 System Exception】 文章目录 WFI 与 WFE等待事件&#xff08;WFE&#xff09;发送事件&#xff08;SEV&#xff09;本地发送事件&#xff08;SEVL&#xff09;WFE 唤醒事件 WFE 使用场景举例与代码实现wfe睡眠函数sev 事件唤醒函数全局监视器和自旋锁 …

【Text2SQL 论文】IncSQL:通过增量式生成 action 序列来得到 SQL

论文&#xff1a;IncSQL: Training Incremental Text-to-SQL Parsers with Non-Deterministic Oracles ⭐⭐⭐ ICLR 2019&#xff0c;arXiv:1809.05054, Microsoft Research 一、论文速读 本文提出了 IncSQL&#xff0c;一个使用 Non-Deterministic Oracles 思路的增量式 Text…

[[nodiscard]]--c++17

作用 用于标记某个函数或者类的成员函数的返回值需要处理。 被标记的函数和类的函数被调用&#xff0c;但是返回值没有接收的时候&#xff0c;编译器会warning. 标记函数 #include <iostream>[[nodiscard]] int square(int x) {return x * x; }int main() {// 注意&am…

C++青少年简明教程:switch语句

C青少年简明教程&#xff1a;switch语句 在C中&#xff0c;switch语句用于基于一个表达式的值来执行不同的代码块。这个表达式通常是一个整数类型&#xff08;如int&#xff0c;char&#xff0c;或枚举类型&#xff09;&#xff0c;并且case标签必须是整数常量表达式。 语法格…

香橙派Kunpeng Pro测评:他给的实在太多了

文章目录 一、开箱环节1、包装配置2、开发板包装3、开发板3.1、开发版正面3.2、开发板背面 二、硬件配置1、硬件配置清单 2、配置图解 三、开机~启动&#xff01;1、运行系统1.1、外设配置1.2、系统启动1.3、官方教程 2、openEuler系统概览 四、系统测试1、性能测试1.1、安装sy…

漫步者x1穷鬼耳机双耳断连

困扰了我两天&#xff0c;终于有时间解决这个问题了&#xff0c;查看了一堆都是别的型号。怎么没人用这个啥按键都没有的耳机QAQ&#xff0c;幸好给我找到了说明书&#xff0c;啊哈哈&#xff01; 说明书地址

堆结构知识点复习——玩转堆结构

前言:堆算是一种相对简单的数据结构&#xff0c; 本篇文章将详细的讲解堆中的知识点&#xff0c; 包括那些我们第一次学习堆的时候容易忽略的内容&#xff0c; 本篇文章会作为重点详细提到。 本篇内容适合已经学完C语言数组和函数部分的友友们观看。 目录 什么是堆 建堆算法…

电脑找不到opencl.dll原因分析及5种详细的解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到opencl.dll”。这通常意味着计算机中缺少或损坏了与OpenCL&#xff08;开放计算语言&#xff09;相关的动态链接库文件。OpenCL允许应用程序利用图形处理器&#xff08;GPU&#xff…

【问题记录】QT“类型强制转换“:无法从“ATL::CString“转换为“LPCWSTR“

一&#xff0c;问题现象 环境&#xff1a;VS2019QT 报错提示&#xff1a;“类型强制转换”&#xff1a;无法从"ATL::CString"转换为"LPCWSTR" 二&#xff0c;解决方法 打开项目属性&#xff0c;设置字符集&#xff0c;如下所示&#xff1a;

BFS解决最短路问题(详解)

目录 BFS简介 && 框架&#xff1a; 一.二叉树的最小深度 二&#xff1a;迷宫中里入口最近的出口&#xff1a; 三.最小基因变化: 四&#xff1a;单词接龙&#xff1a; ​五&#xff1a;为高尔夫比赛砍树&#xff1a; BFS简介 && 框架&#xff1a; 说到BFS…

动态规划-卡特兰数

不同的二叉搜索树&#xff08;96&#xff09; 题目描述: 状态表示: 建立一维数组dp&#xff0c;使用dp[i]来表示i个节点时有的二叉搜索树种类。 状态转移方程: 因为dp[i]表示有i个节点&#xff0c;我们设置一个循环&#xff0c;循环下标为j&#xff0c;此时j代表第几个节点为…

STM32Cube系列教程10:STM32CubeIDE工程创建+串口DMA+IDLE+printf重定向+软中断处理串口数据+非阻塞延时任务

文章目录 工程配置配置时钟配置Debug接口配置串口外设配置时钟树生成代码 配置串口重定向printf配置串口&#xff0c;开启IDLE&#xff0c;开启软中断 配置非阻塞延时任务调度函数编写任务调度函数延时任务创建 编译&#xff0c;下载与测试编译下载测试 前两天收到了ST社区的NU…

5.27周报

这两周邻近毕业故没有很多时间来学习课余内容&#xff0c;另外最近身体有些不舒服【偏头痛】&#xff0c;所以学的内容不多&#xff0c;包括SVM向量机和ResNet【不包括代码复现】 1.SVM支持向量机的大概内容 1、目的&#xff1a; 主要内容是如何找到分类的那条线【超平面】—…

我的世界开服保姆级教程

前言 Minecraft开服教程 如果你要和朋友联机时&#xff0c;可以选择的方法有这样几种&#xff1a; 局域网联机&#xff1a;优点&#xff1a;简单方便&#xff0c;在MC客户端里自带。缺点&#xff1a;必须在同一局域网内。 有些工具会带有联机功能&#xff1a;优点&#xff1a;一…