Go微服务: 关于TCC分布式事务

TCC 分布式事务

  • T: Try 预处理, 尝试执行,完成所有的业务检查,做好一致性,预留必要的业务资源,做好准隔离性
  • C: Confirm 确认,如果所有的分支Try都成功了, 就到了这个阶段, Confirm 是真正执行业务的过程, 不做任何业务检查, 只使用 try 阶段预留的业务资源
  • C: Cancel 取消,所有的分支中,如果有一个失败了,则走到 Cancel 的阶段,Cancel 就释放了 Try 阶段预留的业务资源
  • 所以,Confirm 和 Cancel 是互斥的,只会执行一个,按照TCC的协议,Confirm 和 Cancel 只返回成功,不返回失败
  • 如果有网络问题,或服务器临时故障, 比如崩溃,掉电这种, 事务管理器会进行重试,最终让他成功
  • 在 Try 阶段要做业务检查,保障一致性以及资源预留隔离的一些问题
  • 此阶段只是一个初步的操作, 它和后续的Confirm一起才能真正构成完整的业务逻辑, 这个算是一部分,当所有的 Try 都完成了,就会向下执行,到Confirm
  • Confirm 阶段做一个确认提交, Try 阶段的所有分支事务执行成功后, 开始执行 Confirm, 采用TCC时候,只要Try 成功了,就表示Confirm 阶段不会出错,如果 Confirm 阶段出错,就引入重试机制, 或者人工处理
  • 上图是在 Try 阶段, 资源2执行失败,资源1执行成功, 要回滚资源1,这时候资源1要回滚,就是执行 Cancel, 业务执行错误,需要回滚,执行分支的事务的业务取消,预留资源的释放,一般认为Cancel阶段也是一定成功的, 如果Cancel 出错,也是重试机制和人工处理
  • 上面全局事务发起方是全局事务的管理器,是独立的第三方,可以实现独立的服务,会生成全局的事务记录,全局的事务id贯穿整个分布式事务的调用链,类似 jaeger 的链路追踪traceID,都是分布式的产品,这些产品设计思路都是相互借鉴,所以,这个全局事务管理器可以追踪和调用状态,由于 Confirm 和 Cancel 失败需要进行重试, 所以要实现幂等性,也就是说同一个操作,无论请求多少次,结果都应该是相同的
  • TCC 的三种异常处理:空回滚,幂等,悬挂
    • 1 )空回滚:在没有调用 Try 阶段的方法而调用了第二阶段的 Cancel 方法
    • Cancel 方法要识别出这是一个空回滚, 然后直接返回成功
    • 也就是说空回滚在某种情况下,没有执行 Try, 就直接回滚了
    • 2 )幂等:为了保证TCC的二阶段提交重试机制不会引发数据不一致
    • 就要求TCC的二阶段Try, Confirm, Cancel 接口保证幂等,这样不会重复使用或者释放资源,如果幂等没有控制做好,就很容易导致数据不一致的严重问题
    • 解决思路是增加执行状态,每次执行前,就要查询状态,这就是说你能不能证明你的状态执行到哪里了,可以做一个记录
    • 3 )悬挂:对于一个分布式事务,二阶段的Cancel接口比Try接口先执行了
    • 悬挂对于分布式的二阶段,Cancel 接口比Try接口先执行
    • 对比空回滚是Try是不执行;而悬挂是Cancel先执行,Try再执行
    • 它的解决思路是,如果二阶段执行成功,一阶段就不能再继续执行了,在执行一阶段事务时要判断一下,全局事务是否已经有二阶段事务的记录,如果有,就不执行Try了

TCC 为何这么难?


1 ) 从代码上来说

  • 可以把我们的TCC放到我们的代码,或者说放到一些场景里来看一下
  • 好,我们先从代码说起, 那我们在这里先新建一个目录,就叫 TCC Demo
  • 按照TCC的规则来,我们每一个方法函数都需要有这三个函数: Try, Confirm, Cancel
  • 比如订单业务,有三个函数
    • func TryOrder() {}
    • func ConfirmOrder() {}
    • func CancelOrder() {}
  • 比如下单的时候,需要协同构建库存,增加积分
  • 对于库存来说, 有:
    • func TryStock(){}
    • func ConfirmStock(){}
    • func CancelStock(){}
  • 对于积分来说,有:
    • func TryPoint(){}
    • func ConfirmStock(){}
    • func CancelOrder(){}
  • 如果我们业务中有10个这种,那么我们要写30个这类服务,而且需要有数据库的配合,非常的繁琐

2 ) 基于业务场景来看

  • 先看左边的订单服务,它有自己的这个mysql数据库。它第一步先启动事物和这个TCC事务管理器去交互
  • 它启动事物之后,第二步就调用这个Try,调用所有的资源上的Try
  • 第三步就是要执行提交或者回滚,现在,我们的Try都是ok的
  • 下面它就要执行第四步,这第四步的这个Confirm和Cancel是互斥的, 只能择其一执行
  • 因为你这个Try执行成功了,就直接都是 confirmStock 和 confirmPoint
  • 如果要是有问题,中间可能就是 CancelStock 和 CancelPoint
    在实际开发中一般是一个什么样的情况呢?
    • 就是说 Try 一般是执行主业务的, 比如我们有一个非常难的业务, 在try里基本都搞定了
    • 那对于这个 Confirm和Cancel, 它一般都是基本是比较简单的操作
    • 其实一般只要Try里没有问题, 那么Confirm和这个Cancel就基本上可以认为是没有太大问题,但是还有其他的问题
    • 并不是说,Try ok了,然后 Confirm OK了,Cancel 也 ok 了,就没有问题
    • 分布式的复杂,它是存在各种问题的,比如说你这个分布式网络,你永远不要相信分布式里网络永远是好的
    • 或者说我现在这个库存有另一个小组维护,这个库存它没有问题,但是我们这个积分服务挂了,或者说很慢
    • 我们说这个库存服务,还有这个积分服务,都是其他小组维护的,我们站在我们这个订单角度来说,比如说我是订单服务的负责人
    • 那我不能说动人家这个积分服务的这个代码,比如说积分服务,是挂了或者处理很慢
    • 就要去看这个TCC的事务管理器了,其实这个TCC在开启事务之前,它会详细的记录日志
    • 它有一个日志,每个服务调用了哪个接口,当前事务执行到哪里?
    • 比如,即便积分服务挂了,重启了,对吧?重启以后,我们找到日志,找到这个日志仍然可以继续执行
    • 假如,我们的积分服务 Cancel 执行这个出错了, 那么我们的TCC事务会一直重试
    • 那么TCC事务管理器,要保证执行Cancel不出错,它就会重试。
    • 这样一来就可以解决大部分的网络带来的这个问题
    • 因为Cancel, Confirm, 这里面的这个业务逻辑基本不是很复杂
    • 可能改个状态,或者是添加个什么东西,就是这种类型的,它可能就是网络抖动, 给你造成了一下这个小麻烦
    • 那你你这个重试几次之后呢,补偿一下就可以
    • 从这儿可以看到TCC事务管理器控制整个流程
  • 我们调用TCC,如果Try阶段有问题,那TCC框架就会执行服务的Cancel逻辑撤销之前的操作
  • 如果,我们调用这个TCC如果Try阶段它就有问题,比如说你的这个业务太复杂了,在某个地方突然出了一个小bug
  • 那么TCC框架就会执行各种Cancel逻辑撤销之前的操作
  • 如果上图这个Confirm或Cancel它就是一直不成功,怎么办?
  • 其实分布式它本身虽然比较复杂,但是大部分业务的Confirm和Cancel代码就是很简单
  • 一般的都是网络问题,通过一直调用的进行补偿就可以了
  • 如果一直不成功,你可以在某种程度上做一个记录器进行报警,人为干预
  • 自己做的计录器可以按你自己的业务逻辑,因为你这个TCC事务,比如三次或五次都不成功,它要保证成功,则可以通过电话,微信,钉钉通知人报警
  • 这时候,比如说开发人员肯定是收到了嘛,人为介入解决这个问题就行了嘛
  • 所以,其实TCC真的是不简单,我们只要使用了微服务和这个分布式,就没有办法避免没有这些问题,只要你用了就会遇到这些问题

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

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

相关文章

VCS基本仿真

这里记录三种仿真方式: 第一种是将verilog文件一个一个敲在终端上进行仿真; 第二种是将多个verilog文件的文件路径整理在一个文件中,然后进行仿真; 第三种是利用makefile文件进行仿真; 以8位加法器为例: …

[Bug]使用Transformers 微调 Whisper出现版本不兼容的bug

错误的现象 ImportError Traceback (most recent call last) <ipython-input-20-6958d7eed552> in () from transformers import Seq2SegTrainingArguments training_args Seq2SeqTrainingArguments( output_dir"./whisper-small-…

第九篇——冗余量:《史记》和《圣经》那个信息量大?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 通过信息量的对比&#xff0c;引出来冗余度的概念&#xff0c;又深入浅出…

webman中创建udp服务

webman是workerman的web开发框架 可以很容易的开启udp服务 tcp建议使用gatewayworker webman GatewayWorker插件 创建udp服务: config/process.php中加入: return [// File update detection and automatic reloadmonitor > [ ...........], udp > [handler > p…

小米开放式耳机怎么样?倍思、西圣、小米开放式耳机测评比较!

作为一名热衷于分享真实体验的博主&#xff0c;我在过去两年开始接触开放式耳机&#xff0c;并因此受到许多朋友的咨询&#xff0c;询问哪款开放式耳机更加出色。为了找出最佳的开放式耳机&#xff0c;我进行了深入的调查和实地测试。我发现高价并不总是代表高质量&#xff0c;…

计算机网络 期末复习(谢希仁版本)第3章

对于点对点的链路&#xff0c;目前使用得最广泛的数据链路层协议是点对点协议 PPP (Point-to-Point Protocol)。局域网的传输媒体&#xff0c;包括有线传输媒体和无线传输媒体两个大类&#xff0c;那么有线传输媒体有同轴电缆、双绞线和光纤&#xff1b;无线传输媒体有微波、红…

应急管理大数据指挥中心解决方案(51页PPT)

方案介绍&#xff1a; 本应急管理大数据指挥中心解决方案充分利用了大数据技术的优势&#xff0c;实现了信息的快速收集、分析和决策支持。通过数据融合、协同指挥、智慧化决策和平台建设等方面的努力&#xff0c;提高了应急管理的效率和准确性&#xff0c;为应对各类突发事件…

eclipse连接后端mysql数据库并且查询

教学视频&#xff1a;https://www.bilibili.com/video/BV1mK4y157kE/?spm_id_from333.337.search-card.all.click&vd_source26e80390f500a7ceea611e29c7bcea38本人eclipse和up主不同的地方如下&#xff0c;右键项目名称->build path->configure build path->Libr…

Ubuntu server 24 (Linux) AdGuard Home +SmartDNS 安装配置 搭建去广告快速DNS

一 SmartDNS 安装 &#xff0c;可参考&#xff1a;Ubuntu server 24 (Linux) 安装部署smartdns 搭建智能DNS服务器-CSDN博客 二 安装AdGuard 1 下载地址&#xff1a;GitHub - AdguardTeam/AdGuardHome: Network-wide ads & trackers blocking DNS server 2 解压安装 #下…

算法金 | 不愧是腾讯,问基础巨细节 。。。

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 最近&#xff0c;有读者参加了腾讯算法岗位的面试&#xff0c;面试着重考察了基础知识&#xff0c;并且提问非常详细。 特别是关于Ada…

路由器重启真的好吗?多久重启一次更好?

前言 小白前段时间发现自己家的OpenWRT软路由上网特别慢&#xff0c;有时候通话还有点卡顿。 然而有个朋友用的普通路由器也有类似的问题&#xff0c;而且有时候根本上不去网。 解决的办法很简单&#xff1a;重启路由器。 重启路由器&#xff1f; 但路由器重启是真的好吗&a…

吊车报警的工作原理和使用场景_鼎跃安全

在现代建筑施工过程中&#xff0c;经常使用大型机械设备&#xff0c;如挖掘机、吊车、打桩机等&#xff0c;这些设备在施工过程中发挥着越来越重要的作用&#xff1b;同时&#xff0c;这些设备的作业频繁进行作业&#xff0c;对于接触到高压电线的风险也随之增加。大型机械设备…

R语言探索与分析14-美国房价及其影响因素分析

一、选题背景 以多元线性回归统计模型为基础&#xff0c;用R语言对美国部分地区房价数据进行建模预测&#xff0c;进而探究提高多元回 归线性模型精度的方法。先对数据进行探索性预处理&#xff0c;随后设置虚拟变量并建模得出预测结果&#xff0c;再使用方差膨胀因子对 多重共…

Linux.软件操作

1.yum 命令 要连网 2.systemctl 命令控制软件的启动和关闭 3.ln 创建软连接 使用cat来找本体&#xff0c;看看链接生不生效 4.date 命令查看系统时间 格式化的时候可以用双引号把他们引出来 -d 对时间进行修改 修改时区 自动校准 手动校准 5.ifconfig 查看本机的ip地址 6.h…

钉钉二次开发-企业内部系统集成官方OA审批流程

场景&#xff1a;企业内部开发人员不足&#xff0c;需要从以前集成Activiti的方式转换成集成钉钉官方OA审批流程&#xff0c;提高开发效率和系统稳定性。 摘要&#xff1a;企业内部系统集成Acitiviti开源工作流存在的问题&#xff1a; 1. 企业需要单独搭建工作流服务&#xff…

Echarts 在指定部分做文字标记

文章目录 需求分析1. demo1样式调整2. demo22. demo3 定位解决需求 实现在Echarts的折线图中,相同Y值的两点之间显示’abc’ 分析 1. demo1 使用 ECharts 的 markLine 功能来在相邻两个点之间添加标记。其中,我们通过设置标记的 yAxis 和 label 来控制标记的位置和显示内…

霸气的短视频:成都科成博通文化传媒公司

霸气的短视频&#xff1a;瞬间的力量与魅力 在数字化浪潮中&#xff0c;短视频以其独特的魅力迅速崛起&#xff0c;成为社交媒体的新宠。而在众多短视频中&#xff0c;那些充满霸气、让人热血沸腾的作品&#xff0c;总能引起广泛的关注和讨论。成都科成博通文化传媒公司将从内…

Nginx03-动态资源和LNMP介绍与实验、自动索引模块、基础认证模块、状态模块

目录 写在前面Nginx03案例1 模拟视频下载网站自动索引autoindex基础认证auth_basic模块状态stub_status模块模块小结 案例2 动态网站&#xff08;部署php代码&#xff09;概述常见的动态网站的架构LNMP架构流程数据库Mariadb安装安全配置基本操作 PHP安装php修改配置文件 Nginx…

【面试八股总结】内存页面置换算法

参考资料&#xff1a;小林coding、阿秀 缺页中断 在 CPU 里访问一条 Load M 指令&#xff0c;然后 CPU 会去找 M 所对应的页表项。如果该页表项的状态位是「有效的」&#xff0c;那 CPU 就可以直接去访问物理内存了&#xff0c;如果状态位是「无效的」&#xff0c;则 CPU 则会…

路径

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 用于定位一个文件或者目录的字符串被称为一个路径。在程序开发时&#xff0c;通常涉及两种路径&#xff0c;一种是相对路径&#xff0c;另一种是绝对…