分布式事务调优

性能优化——分布式事务调优 如今,大部分公司的服务基本都实现了微服务化,首先是业务需求,为了解耦业务;其次是为了减少业务与业务之间的相互影响。 电商系统亦是如此,大部分公司的电商系统都是分为了不同服务模块,例如商品模块、订单模块、库存模块等等。事实上,分解服务是一把双刃剑,可以带来一些开发、性能以及运维上的优势,但同时也会增加业务开发的逻辑复杂度。其中最为突出的就是分布式事务了。 通常,存在分布式事务的服务架构部署有以下两种:同服务不同数据库,不同服务不同数据库。我们以商城为例,用图示说明下这两种部署: ... 阅读详情

通常,存在分布式事务的服务架构部署有以下两种:同服务不同数据库,不同服务不同数据库。我们以商城为例,用图示说明下这两种部署:

通常,我们都是基于第二种架构部署实现的,那我们应该如何实现在这种服务架构下,有关订单提交业务的分布式事务呢?

一 分布式事务解决方案

我们讲过,在单个数据库的情况下,数据事务操作具有ACID四个特性,但如果在一个事务中操作多个数据库,则无法使用数据库事务来保证一致性。

也就是说,当两个数据库操作数据时,可能存在一个数据库操作成功,而另一个数据库操作失败的情况,我们无法通过单个数据库事务来回滚两个数据操作。

而分布式事务就是为了解决在同一个事务下,不同节点的数据库操作数据不一致的问题。在一个事务操作请求多个服务或多个数据库节点时,要么所有请求成功,要么所有请求都失败回滚回去。通常,分布式事务的实现有多种方式,例如XA协议实现的二阶提交(2PC)、三阶提交(3PC),以及TCC补偿性事务。

在了解2PC和3PC之前,我们有必要先来了解下XA协议。XA协议是由X/Open组织提出的一个分布式事务处理规范,目前MySQL中只有InnoDB存储引擎支持XA协议。

1. XA规范

在XA规范之前,存在着一个DTP模型,该模型规范了分布式事务的模型设计。

DTP规范中主要包含了AP、RM、TM三个部分,其中AP是应用程序,是事务发起和结束的地方;RM是资源管理器,主要负责管理每个数据库的连接数据源;TM是事务管理器,负责事务的全局管理,包括事务的生命周期管理和资源的分配协调等。

XA则规范了TM与RM之间的通信接口,在TM与多个RM之间形成一个双向通信桥梁,从而在多个数据库资源下保证ACID四个特性。

2. 二阶提交和三阶提交

XA规范实现的分布式事务属于二阶提交事务,顾名思义就是通过两个阶段来实现事务的提交。

在第一阶段,应用程序向事务管理器(TM)发起事务请求,而事务管理器则会分别向参与的各个资源管理器(RM)发送事务预处理请求(Prepare),此时这些资源管理器会打开本地数据库事务,然后开始执行数据库事务,但执行完成后并不会立刻提交事务,而是向事务管理器返回已就绪(Ready)或未就绪(Not Ready)状态。如果各个参与节点都返回状态了,就会进入第二阶段。

到了第二阶段,如果资源管理器返回的都是就绪状态,事务管理器则会向各个资源管理器发送提交(Commit)通知,资源管理器则会完成本地数据库的事务提交,最终返回提交结果给事务管理器。

在第二阶段中,如果任意资源管理器返回了未就绪状态,此时事务管理器会向所有资源管理器发送事务回滚(Rollback)通知,此时各个资源管理器就会回滚本地数据库事务,释放资源,并返回结果通知。

但事实上,二阶事务提交也存在一些缺陷。

第一,在整个流程中,我们会发现各个资源管理器节点存在阻塞,只有当所有的节点都准备完成之后,事务管理器才会发出进行全局事务提交的通知,这个过程如果很长,则会有很多节点长时间占用资源,从而影响整个节点的性能。

一旦资源管理器挂了,就会出现一直阻塞等待的情况。类似问题,我们可以通过设置事务超时时间来解决。

第二,仍然存在数据不一致的可能性,例如,在最后通知提交全局事务时,由于网络故障,部分节点有可能收不到通知,由于这部分节点没有提交事务,就会导致数据不一致的情况出现。

而三阶事务(3PC)的出现就是为了减少此类问题的发生。

3PC把2PC的准备阶段分为了准备阶段和预处理阶段,在第一阶段只是询问各个资源节点是否可以执行事务,而在第二阶段,所有的节点反馈可以执行事务,才开始执行事务操作,最后在第三阶段执行提交或回滚操作。并且在事务管理器和资源管理器中都引入了超时机制,如果在第三阶段,资源节点一直无法收到来自资源管理器的提交或回滚请求,它就会在超时之后,继续提交事务。

所以3PC可以通过超时机制,避免管理器挂掉所造成的长时间阻塞问题,但其实这样还是无法解决在最后提交全局事务时,由于网络故障无法通知到一些节点的问题,特别是回滚通知,这样会导致事务等待超时从而默认提交。

3. 事务补偿机制(TCC)

以上这种基于XA规范实现的事务提交,由于阻塞等性能问题,有着比较明显的低性能、低吞吐的特性。所以在抢购活动中使用该事务,很难满足系统的并发性能。

除了性能问题,JTA只能解决同一服务下操作多数据源的分布式事务问题,换到微服务架构下,可能存在同一个事务操作,分别在不同服务上连接数据源,提交数据库操作。

而TCC正是为了解决以上问题而出现的一种分布式事务解决方案。TCC采用最终一致性的方式实现了一种柔性分布式事务,与XA规范实现的二阶事务不同的是,TCC的实现是基于服务层实现的一种二阶事务提交。

TCC分为三个阶段,即Try、Confirm、Cancel三个阶段。

  • Try阶段:主要尝试执行业务,执行各个服务中的Try方法,主要包括预留操作;
  • Confirm阶段:确认Try中的各个方法执行成功,然后通过TM调用各个服务的Confirm方法,这个阶段是提交阶段;
  • Cancel阶段:当在Try阶段发现其中一个Try方法失败,例如预留资源失败、代码异常等,则会触发TM调用各个服务的Cancel方法,对全局事务进行回滚,取消执行业务。

以上执行只是保证Try阶段执行时成功或失败的提交和回滚操作,你肯定会想到,如果在Confirm和Cancel阶段出现异常情况,那TCC该如何处理呢?此时TCC会不停地重试调用失败的Confirm或Cancel方法,直到成功为止。

但TCC补偿性事务也有比较明显的缺点,那就是对业务的侵入性非常大。

首先,我们需要在业务设计的时候考虑预留资源;然后,我们需要编写大量业务性代码,例如Try、Confirm、Cancel方法;最后,我们还需要为每个方法考虑幂等性。这种事务的实现和维护成本非常高,但综合来看,这种实现是目前大家最常用的分布式事务解决方案。

4. 业务无侵入方案——Seata(Fescar)

Seata是阿里开源的一套分布式事务解决方案,开源一年多已经有一万多star了,可见受欢迎程度非常之高。

Seata的基础建模和DTP模型类似,只不过前者是将事务管理器分得更细了,抽出一个事务协调器(Transaction Coordinator 简称TC),主要维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。而TM则负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。如下图所示:

整个事务流程为:

  • TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID;
  • XID 在微服务调用链路的上下文中传播;
  • RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖;
  • TM 向 TC 发起针对 XID 的全局提交或回滚决议;
  • TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。

Seata与其它分布式最大的区别在于,它在第一提交阶段就已经将各个事务操作commit了。Seata认为在一个正常的业务下,各个服务提交事务的大概率是成功的,这种事务提交操作可以节约两个阶段持有锁的时间,从而提高整体的执行效率。

那如果在第一阶段就已经提交了事务,那我们还谈何回滚呢?

Seata将RM提升到了服务层,通过JDBC数据源代理解析SQL,把业务数据在更新前后的数据镜像组织成回滚日志,利用本地事务的 ACID 特性,将业务数据的更新和回滚日志的写入在同一个本地事务中提交。

如果TC决议要全局回滚,会通知RM进行回滚操作,通过XID找到对应的回滚日志记录,通过回滚记录生成反向更新SQL,进行更新回滚操作。

以上我们可以保证一个事务的原子性和一致性,但隔离性如何保证呢?

Seata设计通过事务协调器维护的全局写排它锁,来保证事务间的写隔离,而读写隔离级别则默认为未提交读的隔离级别。

二 总结

在同服务多数据源操作不同数据库的情况下,我们可以使用基于XA规范实现的分布式事务,在Spring中有成熟的JTA框架实现了XA规范的二阶事务提交。事实上,二阶事务除了性能方面存在严重的阻塞问题之外,还有可能导致数据不一致,我们应该慎重考虑使用这种二阶事务提交。

在跨服务的分布式事务下,我们可以考虑基于TCC实现的分布式事务,常用的中间件有TCC-Transaction。TCC也是基于二阶事务提交原理实现的,但TCC的二阶事务提交是提到了服务层实现。TCC方式虽然提高了分布式事务的整体性能,但也给业务层带来了非常大的工作量,对应用服务的侵入性非常强,但这是大多数公司目前所采用的分布式事务解决方案。

Seata是一种高效的分布式事务解决方案,设计初衷就是解决分布式带来的性能问题以及侵入性问题。但目前Seata的稳定性有待验证,例如,在TC通知RM开始提交事务后,TC与RM的连接断开了,或者RM与数据库的连接断开了,都不能保证事务的一致性。

亿级流水下的生死考验:MYCAT XA分布式事务生产实战全解+从原理到调优的血泪指南 当支付系统凌晨3点的告警惊醒整个团队,1200万跨行转账交易卡在‘PREPARED’状态时,我们才真正理解:分布式事务的战场没有演习,只有生死” 阅读详情

相关推荐

通讯接口应用笔记3:使用W5500实现Modbus TCP服务器

  前面我们设计实现了W5500的驱动程序,也讲解了驱动的使用方式。在最近一次的项目应用中,正好有一个使用W5500实现TCP通讯的需求,所以我们就使用该驱动程序轻松实现。这一篇中我们就来说一说基于我们W5500通讯驱动程序实现TCP通讯的过程。 1、应用需求   在本次应用中,要求实现一个基于W5500的Modbus TCP服务器。这个需求的描述虽然只有一句话,但是这个需求的内容可不简单。我们首先来分析一下这个需求的具体内容。   为了实现基于W5500的Modbus TCP服务器,我们必先须基于W550

木南创智 5500

Seata分布式事务失效,不生效(事务不回滚)的常见场景

一、微服务没有正常获取XID 检查方法: 在每个微服务中调用方法 RootContext.getXID() 检查XID 例如,服务A调用了服务B和服务C 那么可以分别在服务A、服务B、服务C的事务方法中添加 ===============服务A @Service public class ServiceAImpl implements IServiceA { private static final Logger log = LoggerFactory.getLogger(Serv

godkzz的博客 1万+

手把手教你用STM32+LAN8720搭建以太网通信模块(含原理图)

本文详细介绍了如何使用STM32微控制器与LAN8720物理层芯片搭建以太网通信模块,涵盖硬件设计、软件配置及常见问题排查。重点讲解了LAN8720的低功耗设计、RMII接口简化布线等特性,以及STM32CubeMX配置和LwIP协议栈移植技巧,助力开发者快速实现稳定可靠的嵌入式网络通信。

CAT789的专栏 416

Feign接口降级及全局异常处理条件下seata全局事务不回滚问题解决方案

1.问题描述 开启全局事务demo: /** @Description: 同步数据 @Param: [schemeSyncVo] @return: com.vulcan.base.domain.R<java.lang.Boolean> @Author: Lvlin.Lou @Date: 2029/9/16 10:59 */ @GlobalTransactional @Transactional @Override public R synchronousDataRelation(SchemeS

晏翔的博客 4541

别再手动算考勤了!教你用Python+企业微信API自动生成月度报表

本文介绍如何利用Python和企业微信API构建自动化考勤分析系统,实现从数据获取到可视化报表生成的全流程自动化。通过企业微信打卡接口获取数据,使用Pandas进行高效清洗和分析,并生成Excel和HTML格式的报表,大幅提升考勤统计效率。系统支持智能判定考勤状态,如迟到、早退等,并可通过定时任务实现月度自动化运行。

weixin_27875131的博客 290

微信小程序后台定位与实时位置更新的实战指南

本文提供了微信小程序实现后台定位与实时位置更新的完整实战指南。针对小程序退到后台后位置更新中断的痛点,详细解析了基于`startLocationUpdateBackground`API的后台定位解决方案。内容涵盖从隐私协议配置、项目权限声明,到授权、启动、监听、停止的核心代码流程,并分享了真机调试、性能优化及权限引导等关键避坑经验,帮助开发者构建稳定可靠的后台位置服务。

weixin_29008055的博客 473

openfeign seata事务不回滚_微服务分布式事务4种解决方案实战

分布式事务分布式事务是指事务的参与者,支持事务的服务器,资源服务器分别位于分布式系统的不同节点之上,通常一个分布式事物中会涉及到对多个数据源或业务系统的操作。典型的分布式事务场景:跨银行转操作就涉及调用两个异地银行服务CAP理论CAP理论:一个分布式系统不可能同时满足一致性,可用性和分区容错性这个三个基本需求,最多只能同时满足其中两项一致性(C):数据在多个副本之间是否能够保持一致的特性。可用性(...

weixin_39683144的博客 1934

PaddleOCRv5训练自己的模型-微调文字识别模型

本文介绍了使用PaddleOCR微调文字识别模型的具体步骤。首先需要按照官方格式准备数据集,包括图片和标注文件。然后进行模型训练,包括环境安装、预训练模型下载、配置文件修改等关键环节,特别针对训练中可能出现的类别数不匹配问题提供了三种解决方案。文章还详细说明了模型导出为静态图格式的方法,以及如何调用训练好的模型进行推理。整个过程涉及多个技术细节,如早停机制设置、断点续训方法等,为需要提升OCR识别精度的开发者提供了实用指导。

weixin_43827982的博客 3177

Seata做分布式事务时,报错后事务不回滚的问题

具体问题举例:有两个服务A和服务B,服务A通过openfiegn调用服务B的接口,服务A和服务B都能正常注册到seat服务。但当服务A的serviceA调用服务B的serviceB时,serviceB执行成功并返回结果到serviceA中,然后serviceA报错,些时serviceA能回滚,serviceB不能回滚。一:seat全局事务id是在放在heard中在服务间传递的,然而通过断点,确实在服务B的请求request.header中有事务id。1、Seata做分布式事务时,报错后事务不回滚的问题?

朗朗的博客 5115

道威棱镜的设计参考

道威棱镜的设计参考

weixin_72050316的博客 383

2024年数字IC秋招-华为机试-数字芯片-实习笔试题

笔试题目:40个选择题A.综合时不同文件列表内的宏定义仅在本列表生效B.宏定义会覆盖,不需要单独undefC.仿真时出现宏定义冲突以最后一次值为准D.宏定义最好在各文件中随用随定义A.4/9B.4/6C.01D.0/6。

qq_42135020的博客 2892

分布式事务的性能调优与优化

1.背景介绍 分布式事务是现代分布式系统中不可或缺的一部分,它可以确保多个分布式节点之间的事务性操作的一致性。然而,分布式事务的实现和管理是非常复杂的,因为它涉及到多个节点之间的协同和同步。在分布式系统中,性能是非常重要的因素,因此,分布式事务的性能调优和优化是一个至关重要的问题。 在本文中,我们将讨论分布式事务的性能调优和优化的关键概念、算法原理、实例代码和未来趋势。我们将从以下几个方面进行...

AI天才研究院 447

Android 13 内置xapk安装包的方法

安装xapk 内置xapk

安卓兼职framework和app工程师的博客 224

Seata心跳参数调优:从玄学到科学——如何让分布式事务稳如老狗?

科学的调优需结合业务特征(如延迟敏感度、并发量)、基础设施(网络质量、存储性能)及实时监控数据,通过“假设-实验-验证”的迭代过程逼近最优解。没有银弹参数,只有最适合场景的黄金组合。在Seata的分布式事务架构中,事务协调器(TC)与资源管理器(RM)之间的心跳检测是维持事务一致性的核心机制。以下是科学调优的四大原则与实操指南。Seata的心跳机制本质是。

全栈开发工程师 916

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

DTM冷启动优化:分布式事务系统的初始化性能调优

你是否曾遭遇过这样的困境:分布式事务系统DTM(Distributed Transaction Manager)部署完成后,首次启动耗时过长,导致业务服务无法及时响应?在高并发场景下,这种初始化延迟可能造成流量堆积、超时重试甚至系统雪崩。本文将从存储引擎配置、连接池优化、数据预热三个维度,提供一套可落地的冷启动优化方案,帮助你将DTM初始化时间从分钟级压缩至秒级。 ## 存储引擎选择:性能与启动...

gitblog_00385的博客 741

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java性能优化十六、分布式事务调优

文章目录分布式事务调优一、如何设计更优的分布式锁1、数据库实现分布式锁2、Zookeeper 实现分布式锁3、Redis 实现分布式锁4、Redlock 算法总结二、电商系统的分布式事务调优1、分布式事务解决方案1.XA 规范2.二阶提交和三阶提交3. 事务补偿机制(TCC)4.业务无侵入方案——Seata(Fescar)总结 分布式事务调优 一、如何设计更优的分布式锁 在 JVM 中,在多线程并发的情况下,我们可以使用同步锁或 Lock 锁,保证在同一时间内,只能有一个线程修改共享变量或执行代码块。但现.

小宇哥x的博客 797

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

分布式事务Seata性能调优实战指南

摘要:微服务架构下,Seata分布式事务性能调优面临网络延迟、锁竞争和日志开销三大核心挑战。测试验证表明,通过异步消息队列解耦TC负载、优化锁机制(如TCC模式控制粒度)及日志批处理,可使事务吞吐量提升2-3倍,响应时间缩短30%-40%。测试人员需全程参与性能基准设定(如10K+QPS压测)和监控(Prometheus+SkyWalking),重点关注TPS、ART及错误率指标。未来AI调度优化与持续测试验证将成为性能保障的关键。(149字)

2501_94309040的博客 938

分布式事务 Seata 框架在电商系统中的性能调优实践

本文通过实践验证了 Seata 框架在电商系统中的性能调优路径:在事务管理层面采用异步补偿机制,网络通信优化 HTTP/2 协议,资源监控实施动态扩缩容,数据一致性引入三阶段补偿协议,服务降级建立熔断矩阵。实测数据显示,综合性能提升 2.3 倍,但需平衡系统吞吐与事务成功率。1)基于 AI 的动态事务策略生成,通过机器学习分析历史事务数据自动生成最优补偿策略;2)分布式事务的细粒度控制,实现秒级到微秒级的延迟分级管理;3)跨云厂商事务一致性保障,解决多云环境下的数据同步问题。

2501_92435995的博客 962

终极DTM性能优化指南:从零到千万级TPS的分布式事务系统调优实践

DTM作为一款高性能分布式事务框架,在处理高并发场景时需要进行专业调优才能充分发挥其潜力。本文将分享经过实践验证的性能优化策略,帮助你将DTM系统的TPS提升至千万级,轻松应对高并发业务挑战。 ## 环境配置优化:性能调优的基础准备 要实现DTM的高性能运行,首先需要对基础环境进行优化配置。在`helper/bench/test-redis.sh`脚本中,我们可以看到专业的性能测试配置示例:

gitblog_00004的博客 733

分布式事务超时调优实战(从毫秒级响应到零异常提交)

掌握分布式事务的超时设置调优方法,提升系统稳定性与响应速度。适用于微服务、跨库事务等场景,通过合理配置超时阈值、优化重试机制和全局事务协调,实现毫秒级响应与零异常提交。实战经验总结,值得收藏。

CodeNexus的博客 932

电商系统的分布式事务调优

微服务架构下分布式事务的解决方案主要包括XA规范的二阶提交(2PC)、三阶提交(3PC)和TCC补偿性事务。2PC通过准备和提交两个阶段保证事务一致性,但存在阻塞和数据不一致风险;3PC在2PC基础上增加预提交阶段以降低阻塞时间。TCC采用最终一致性,通过Try、Confirm、Cancel三个阶段实现柔性事务,虽性能更优但对业务侵入性强。Seata是新兴的分布式事务解决方案,旨在平衡性能与侵入性,但其稳定性仍需验证。在跨服务场景下,TCC是目前最常用的方案。

技术与业务融合思维 1002

Java面试翻车实录:从JVM调优到分布式事务,牢大面大厂电商岗的三轮灵魂拷问

面试就像打怪升级,基础题是新手村任务,框架原理是精英怪,分布式系统是副本BOSS。基础要牢:Java集合、JVM、并发编程是基石源码要读:Spring、MyBatis等框架源码至少要看过核心流程实践要深:不能停留在「会用」,要理解「为什么这么设计」系统设计要广:分布式事务、高并发、微服务架构要能说出完整方案推荐学习路径📖 《深入理解Java虚拟机》+《Java并发编程的艺术》🔧 动手搭建一个完整的电商微服务项目🧠 多刷系统设计面试题,理解每个技术选型背后的trade-off。

qq_45952553的博客 452

Day818.电商系统的分布式事务调优 -Java 性能调优实战

在同服务多数据源操作不同数据库的情况下,可以使用基于 XA 规范实现的分布式事务,在 Spring 中有成熟的 JTA 框架实现了 XA 规范的二阶事务提交。事实上,二阶事务除了性能方面存在严重的阻塞问题之外,还有可能导致数据不一致,我们应该慎重考虑使用这种二阶事务提交。在跨服务的分布式事务下,可以考虑基于 TCC 实现的分布式事务,常用的中间件有 TCC-Transaction。TCC 也是基于二阶事务提交原理实现的,但 TCC 的二阶事务提交是提到了服务层实现。

阿昌爱Java 1382
上一篇: Spring源码分析之依赖注入(一)
下一篇: 【项目实战】—— SSM 图书管理系统
java_lujj
博客等级 码龄4年 18粉丝 152原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值