大家好,今天想和大家一起聊聊分布式事务。

今天主要说主要内容如下:

* 分布式事务TCC

我们知道布式式事物TCC代表Try、Confirm、Cancel,就是尝试、确认、取消。这个是互联网上比较常见的分布式事务。首先它的运行逻辑如下图。

执行步骤是这样的

  1. 提供两个服务,服务A和服务B
  2. 每个服务里边需要行提供try、conform、cancel的方法用于执行。
  3. 当业务发起分布式事物调用之后,先记录到日志中,然后执行try操作,如果没有问题的话执行confirm操作。
  4. 如果其中某个过程出现了问题此时需要执行cancel操作。

举个例子:

购买一件商品,那么我们有几个服务,一个是订单服务,一个是库存服务,还是一个是货运的服务,当我们购买了一件商品之后,订单服务的状态会变为支付成功,库存的服务将会减少,货运会将这商品进行出库。

此时,我们的try操作就是将这几个服务做成一个“冻结”状态,confirm就是将“冻结”的状态变为“非冻结”,这个时间就是操作成功了,cancel就是将“冻结”状态进行变为之前的形态。我们直接将这个状态由结果变为正在进行的状态,这种好处是可以进行还原,并且设计的时候还能保留结果。

try时各个服务的处理:

订单服务:将订单状态由UNPAID(未支付)变为PAYING(支付中)

库存服务:设置一个frozen_num, 比如库存10个,购买2个。库存数量变为8,frozen_num 变为2,即冻结了2个。

货运服务:货运服务将2个购买的做一个货运单,状态为PREPARING(备货中)

confirm时各个服务的处理

订单服务:将订单的状态变为PAIED(支付成功)

库存服务:将frozen_num由2变为0,说明已经成功卖出去了

货运服务:货运单的状态变为READY(可以发货)

cancel时各个服务的处理

订单服务:状态变为CANCELED(取消)

库存服务:frozen_num变为0,同时库存服务由8变为10个

货运服务:货运服务将2个商品的货运单状态变为CANCELED(取消)

通过这样的服务设计,我们能够很好的将服务在各个状态中转换。当然,里边还有很多细节,比如,某个服务出现了问题,库存服务出现问题了,我们应该怎么办?

我们可以看到图版中还有一个事物协调器,当事务执行try调用所有服务成功的同时也需要执行的中间过程数据进行记录,比如购买库存数2,它的作用就是当某个服务出现问题时可以进行快速的回滚操作。事物协调器也执行confirm、cancel,假如一个服务confirm失败后,则它会调用另外两个服务的cancel方法。

我们执行try成功后,在执行confirm的时候,库存服务出现了问题,比如服务机器挂了,此时我们应该有一个任务,会不断的调用这个库存服务,当然尝试的次数也是有一定的时间间隔,这个可以由我们自己根据业务进行设计,比如一个指数级重试。如果重试到一定次数的时候,那么就需要进行提醒人工进行处理。cancel也同理,这样设计的目的是防止出现服务问题导致的数据不一致。

因为TCC是柔性事物架构,所以互联网大厂使用的也很多。支持的框架也不少,比如tcc-tranaction, ByteTCC, seata都是支持。

使用TCC的时候,我们需要自己大量写一些try、confirm、cancel的逻辑,这样业务代码量也会相对不少,但是由于可以处理高并发量的请求,也深受很多大厂的喜欢。

分布式事务TCC的更多相关文章

  1. Hmily:高性能异步分布式事务TCC框架

    Hmily框架特性 无缝集成Spring,Spring boot start. 无缝集成Dubbo,SpringCloud,Motan等rpc框架. 多种事务日志的存储方式(redis,mongdb, ...

  2. [跨数据库、微服务] FreeSql 分布式事务 TCC/Saga 编排重要性

    前言 FreeSql 支持 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/Gbase/神通/人大金仓/翰高/Clickhouse/MsAcc ...

  3. java基础之----分布式事务tcc

    最近研究了一下分布式事务框架,ttc,总体感觉还可以,当然前提条件下是你要会使用这个框架.下面分层次讲,尽量让想学习的同学读了这篇文章能加以操作运用.我不想废话,直接上干货. 一.什么是tcc?干什么 ...

  4. 微服务痛点-基于Dubbo + Seata的分布式事务(TCC模式)

    前言 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案. ...

  5. .Net Core with 微服务 - 分布式事务 - TCC

    上一次我们讲解了分布式事务的 2PC.3PC .那么这次我们来理一下 TCC 事务.本次还是讲解 TCC 的原理跟 .NET 其实没有关系. TCC Try 准备阶段,尝试执行业务 Confirm 完 ...

  6. 高性能异步分布式事务TCC框架(资料汇总)

    https://github.com/yu199195/hmily tcc源码解析系列(一)之项目结构 https://yu199195.github.io/2017/10/11/TCC/tcc-on ...

  7. SpringCloud分布式事务TCC实现

    可以参考 http://www.txlcn.org/ 的实现方式

  8. Java之分布式事务TCC

    看这个博客吧! 挺好的. 理论:https://www.cnblogs.com/jajian/p/10014145.html 实践:https://www.cnblogs.com/sessionbes ...

  9. 分布式事务之解决方案(TCC)

    4. 分布式事务解决方案之TCC 4.1. 什么是TCC事务 TCC是Try.Confirm.Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作 :预处理Try.确认Confirm.撤销C ...

  10. 分布式事务二TCC

    分布式事务解决方案之TCC 4.1.什么是TCC事务 TCC是Try.Confirm.Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try.确认Confirm.撤销Cancel ...

随机推荐

  1. linux下npm安装的全局命令无法执行

    npm install laravel-echo-server -g 安装了之后在其他目录无法执行,找不到命令,在windows下可以直接使用,在linux下需要配置下环境变量 npm prefix ...

  2. 搭建自己的OCR服务,第三步:PPOCRLabel标注工具安装

    一.安装说明 安装好了PaddleOCR后,还需要安装PPOCRLabel这个标注工具,想要自己训练模型的话,有个标注工具会起很大作用. 尤其是PPOCRLabel就是跟PaddleOCR配套的标注工 ...

  3. NumPy学习4

    今天学习NumPy相关数组操作 NumPy 中包含了一些处理数组的常用方法,大致可分为以下几类:(1)数组变维操作(2)数组转置操作(3)修改数组维度操作(4)连接与分割数组操作 numpy_test ...

  4. 如何让低于1B参数的小型语言模型实现 100% 的准确率

    如何让低于1B参数的小型语言模型实现 100% 的准确率 上下文学习被低估了--ICL 是提升性能的秘密钥匙--教会 AI 说"我不知道"--第 2 部分 Fabio Matric ...

  5. Docker 运行命令

    停止所有的容器 docker stop $(docker ps -aq) 启动所有的容器 docker start $(docker ps -aq) 停止容器 docker stop <容器Na ...

  6. linux 下给网卡添加ipv6、路由

    route命令的使用举例如下:   route // 显示路由信息.   route add –host 192.168.1.110 dev eth0  // 给网卡eth0的路由表中加入新地址192 ...

  7. 比较LLM的function calling,Agent 和MCP

    比较 对比维度 ​MCP(Model Context Protocol)​ ​Function Calling ​Agent(智能体)​ ​定义 由 Anthropic 推出的开放协议,标准化 LLM ...

  8. RAGflow搭建text-to-sql的AI研发助手

    一.概述 text-to-sql 技术允许用户通过自然语言提问,系统自动将其转换为 SQL 语句并执行,大大降低了数据查询的门槛,提高了工作效率. text-to-sql 技术在数据分析.智能客服.数 ...

  9. Ruby+Appium+testunit实现app自动化demo

    1.安装对应库 gem install test-unit gem install appium_lib 2.编写代码 代码如下: require 'appium_lib' require 'test ...

  10. 基于MySQL分析线上充值留存率

    1.数据清洗 步骤: 1.查询charge_record表业务类型为充值且订单状态为成功的数据 2.将上述数据转移到本地数据库 使用如下脚本: # coding=utf-8import pymysql ...