Spring Cloud的分布式事务框架压测第一轮

Spring Cloud Alibaba + Seata 分布式事务实战:从架构设计到秒杀场景落地(附完整源码) 选择Seata 2.0 + Spring Cloud Alibaba组合,支持AT模式与Saga模式混合使用。(声明:本文方需遵循Apache 2.0开源协议,商业使用请遵守Seata官方授权政策)文末提供「分布式事务调试工具包+百万级压测脚本」,点击目录直达!2025年微服务架构下,83%的企业面临分布式事务一致性难题。这套参数配置让某电商平台事务成功率从92%提升至99.97%某物流公司采用此方案将跨系统事务耗时从8s降至1.2s。该方案支撑某平台双11期间180万笔/分钟的订单峰值。 阅读详情

转载:

SpringCloud中国社区

http://springcloud.cn/view/374

 

前言

分布式事务对微服务开发者而言是既想努力避免又无法完全回避的蛋疼问题。通过使用分布式事务处理框架可以很大程度上解决分布式事务所带来的事务性能、可靠性问题,以及引入的编码复杂性。本文由海信HICS技术团队压测提供,目前国内主要的开源分布式事务框架框架包括:

框架名称GitHub地址star数量
社区开源项目dtshttps://github.com/venusteam/dts111
tcc-transactionhttps://github.com/changmingxie/tcc-transaction2192
Hmilyhttps://github.com/yu199195/hmily1196
ByteTCChttps://github.com/liuyangming/ByteTCC1137
mythhttps://github.com/yu199195/myth894
EasyTransactionhttps://github.com/QNJR-GROUP/EasyTransaction805
tx-lcnhttps://github.com/codingapi/tx-lcn/802

我们响应springcloud社区的号召,计划对上框架的非功能对比测试,希望对大家日后的选型有所帮助。
本文是此测试的第一轮,本轮对不使用消息中间件的分布式事务处理模式进行了测试(包括TCC、广义上的2PC,3PC等),测试框架包括:

测试硬件环境

应用服务器规格均为(2核4G,实例规格ecs.c5.large)

mysql数据库规格为(RDS配置为2核4G,实例规格rds.mysql.s2.large,MySQL5.7高可用版)

ECS主机与RDS均在同一内网环境下

测试业务场景

本测试场景涉及三个服务:

  • 订单服务
  • 支付服务
  • 库存服务

用户请求订单服务创建订单,订单服务作为事务发起者,发起分布式事务,订单服务分别请求库存服务与支付服务完成相应操作,从而完成一个分布式事务。

服务间调用关系图

服务中涉及数据库操作

订单服务

  • 新增订单信息
  • 新增订单明细信息
  • 新增/更新商品统计信息
  • 查询商品信息
  • 查询商品品类信息
  • 查询更新商品统计信息

支付服务

  • 新增支付信息
  • 新增支付优惠信息
  • 新增/更新支付统计信息
  • 查询支付统计信息

库存服务

  • 新增库存变动信息
  • 更新库存信息
  • 查询库存信息

测试说明

  • 针对上面的框架进行性能测试,对于性能较好的框架会进一步进行事务可靠性测试
  • 商品库模拟了1000种商品
  • 测试软件使用 Apache JMeter,模拟在30到200个线程情况下,测试各个框架的平均响应时间与平均TPS数值。一般而言,平均响应时间越低,平均TPS数值越高,则性能越好。

性能测试

分布式事务测试结果概要

先上性能测试结果,有时间的同学可以看详细的测试过程

名次框架名称最高平均TPS
对照组本地事务850.2
1LCN554.6
2EasyTransaction346.4
3Hmily132.3
4tcc-transaction127.7

测试参考基准

先将所有的分布式事务逻辑以及数据库操作在一个单体服务的本地事务中完成做为本次后续性能测试的对照基准。

我们测试了在30、50、100、150、200个线程下,本地事务情况下的TPS测试结果如下:

线程数平均TPS平均响应时间(ms)
30线程850.235
50线程847.158
100线程845.2117
150线程828.2178
200线程828.4236

基准测试性能瓶颈在数据库上,数据库的CPU占用达90%以上。

A场景.订单商品是从1000中商品中随机选择的场景

tcc-transaction

首先,测试star最多的tcc-transaction,本次测试使用1.2.x分支。

tcc-transaction在GitHub上有完整的使用说明文档,并且提供了基于dubbo、http等方式的demo,对于使用者来说比较友好。

tcc-transaction在使用上通过注解的形式编写分布式事务的confirm与cancel代码,具有代码入侵性较小的特点。

对于tcc-transaction,测试其在30、50、100个线程下的表现,测试结果如下:

线程数平均TPS平均响应时间(ms)
30线程125.6236
50线程127.7387
100线程125.5785

tcc-transaction性能分析

分析发现tcc-transaction的性能压力主要集中在数据库上,一个分布式事务涉及至少四次框架层面的数据库操作,一次插入、至少两次更新、一次删除,由下图可以看出操作耗时大约在15ms,对比其他框架的1~2ms可以说是响应时间非常慢了。其中操作耗时长的表中均有多个长字段,包括一个长度是8000、类型为VARBINARY的字段,且更新与插入的比例高于其他框架的事务操作比例。

此外数据库出入网络流量在120TPS时,已达到28M/s,带宽占用高达224Mbps。即使数据库服务器性能提高,在千兆网络环境下,带宽占用将成为瓶颈。

Hmily

然后,测试star数第二的Hmily。

Hmily有作者自己博客上的源码解析文章,还有录制的环境搭建和源码详解的视频,框架支持dubbo、motan、springcloud多种RPC框架,作者也给出了以上RPC框架的demo代码,对于开发者来说,了解源码与使用框架都非常方便。

说明

  • 测试demo基于框架自带的Spring Cloud demo改造,运行依赖Eureka

对于Hmily,测试其在50、100、200线程下的表现,测试结果如下:

线程数平均TPS平均响应时间(ms)
50线程132.3377
100线程123.5806
200线程130.41530

Hmily性能分析

通过工具分析发现,Hmily在压力测试中,线程大部分时间处于阻塞状态,多数线程都处于等待锁的状态中。

blocked-thread

通过追踪处于阻塞状态线程的调用方法栈,注意到StarterHmilyTransactionHandler类中有一个可重入锁,这个锁加在了confirm阶段,这个加锁对于性能产生了影响,导致多数的线程处于阻塞的状态。confirm加锁能够防止发生错乱,但是对性能却产生较大的影响,建议作者优化confirm加锁的方式,提高框架的性能。

ByteTCC

接下来是仅比Hmily少59个star而屈居第三位的BtyeTCC。

ByteTCC在有使用方法的文档,也提供了dubbo、springcloud两种RPC框架的demo,开发者入门比较方便。

然而在上周测试ByteTCC时,框架提供的springcloud demo却不能正常运行,由于测试时间比较紧张的关系,没有时间基于ByteTCC框架自行开发测试demo,因此ByteTCC的测试暂时搁置,希望ByteTCC作者更新一下示例demo,使得demo更加易用。

EasyTransaction

EasyTransaction基于TCC、补偿以及消息队列等多种形式实现了分布式事务,不同的实现形式可以在同一个分布式事务中使用,开发者可以选择自己适用的场景开发。但是,EasyTransaction示例代码只有单元测试代码,demo代码不及以上几个框架,对于开发者不够易用。EasyTransaction对于代码的入侵性比较大,不及其他框架方便。

说明

  • 测试demo基于单元测试代码使用Spring Cloud自行开发,运行依赖Eureka
  • 运行EasyTransaction框架依赖ZooKeeper、Kafka
  • 仅测试EasyTransaction框架的TCC场景

对于EasyTransaction,测试其在30、50、100、150线程下的表现,测试结果如下:

线程数平均TPS平均响应时间(ms)
30线程334.589
50线程346.4143
100线程346.4286
150线程345.1426

EasyTransaction性能分析

EasyTransaction在简单的性能测试中未发现明显的性能问题,其远程调用采用了多线程的处理方式,较大的提升了框架的性能。但在测试中发现框架存在两个问题:

  • 即使只使用TCC,在框架启动时也会检查是否部署了消息中间件。
  • 虽然有远程调用超时处理的注解,但未实现。

LCN

最后是star数最少的LCN。

LCN有比较全面的文档,包括原理介绍、使用说明、视频讲解,演示demo等,而且LCN对于业务代码的入侵性极小,开发者使用起来也比较方便。不过LCN需要单独部署txmanager服务。

说明

  • 测试demo基于框架自带的Spring Cloud demo改造,运行依赖Eureka
  • 运行LCN框架依赖tx-manager

对于LCN,测试其在50、100、150线程下的表现,测试结果如下:

线程数平均TPS平均响应时间(ms)
50线程455.3109
100线程530.2188
150线程554.6269

LCN性能分析

在简单的性能测试中未发现明显的性能问题。在A性能场景中表现最好。

B场景.单商品订单性能测试

为进一步评估LCN和EasyTransaction的性能,我们又对订单集中在单一商品的场景进行了测试,以了解框架在访问集中在某个业务实体的情况下的性能表现。

单个商品测试

对于EasyTransaction与LCN,我们增加了单个商品的测试,就是说所有请求都会更新一条商品的库存数据。

采用50个线程,最终测试结果如下:

 单个商品TPS一千个商品TPS下降比率
LCN118.5455.373.9%
EasyTransaction166.2346.452.0%

性能分析

可以看到由于LCN的事务处理机制导致事务完成前会锁定所有的分布式资源,导致在此场景下性能衰减比较大。

可靠性测试

可靠性测试选取性能测试中表现较好的LCN与EasyTransaction进行。可靠性测试以压测的形式,最终评估压测过程中的全部订单数据、支付数据、库存数据是否与实际完成的交易结果保持一致。

可靠性测试场景说明

在可靠性测试中会通过一定的规则抛出异常的方式来制造事务异常,来验证事务异常场景下,分布式事务的数据最终一致性。

异常规则如下:

  • 在支付服务中对于总价格为100的数据抛出异常
  • 在库存服务中对于商品ID为100的数据抛出异常

商品价格价格为1-10000之间随机,商品ID为1-1000之间随机,购买数量也通过一定的规则随机产生。

可靠性测试总发送100万个请求,记录所有成功请求的参数中的商品价格以及商品个数等信息,最终在查询三个服务各自数据库中的数据,看销售金额以及售出商品个数与请求参数总的结果是否一致。

EasyTransaction

统计记录的所有成功请求的数据,总商品价格是3000172719,查询订单服务的数据库中总销售金额为3000172719,在支付服务数据库中扣除销售金额为100的错误数据后,销售金额也为3000172719,三者一致。

统计记录的所有成功请求的数据,总购买数量1799058,查询订单服务的数据库中商品总售出数量是1799058。在库存服务数据库1000种商品总扣减的库存数也是1799058,三者一致。

LCN

统计记录的所有成功请求的数据,总商品价格是4375046335,查询订单服务的数据库中总销售金额为4375046335,在支付服务数据库中销售金额也为4375046335,三者一致。

统计记录的所有成功请求的数据,总购买数量2624655,查询订单服务的数据库中商品总售出数量是2624655。在库存服务数据库1000种商品总扣减的库存数也是2624655,三者一致。

测试通过统计订单数据库、支付数据库、库存数据库的数据,来检测分布式事务最终一致性。经过测试发现EasyTransaction与LCN都能可靠的完成分布式事务,达到最终一致性。

总结

本次测试中,性能方面表现亮眼的是LCN和EasyTransaction,对tcc-transaction和Hmily来说,在性能优化方面还有很大的改进空间;在可靠性方面,LCN与EasyTransaction都表现不错。

LCN总结

tx-lcn是LCN(lock,cancel,notify)的事务模式的实现

优点

  • 性能优秀
  • 可靠性强
  • 代码入侵性小
    在本次对比的所有框架中,LCN实现的分布式事务处理模式,编码复杂性和入侵代码量最低。

缺点

  • 需额外部署tx-manager服务节点。
  • 由于需要lock资源这种处理方式,如果集中更新某几个热门商品时,LCN的性能衰减量大于TCC模式。
  • 服务超时时,会造成其他服务的资源被锁住,比如支付服务超时过程中,相关商品库存会一直无法操作。

EasyTransaction总结

基于Spring事务为基础,实现了多种分布式事务处理模式并提供扩展接口(本次仅对TCC模式进行了测试)

优点

  • 针对远程调用采用多线程并发处理的模式,性能优化较好
  • 可靠性强
  • 整合简单,无需额外部署事务管理节点

缺点

  • 对比其他框架,入侵性和编码量是偏大的
  • RPC请求超时处理尚未实现

tcc-transaction总结

实现TCC模式

优点

通过注解的形式声明TCC的的confirm与cancel方法,代码入侵性较小。

缺点

  • 对数据的性能压力太大,操作响应时间长,带宽占用高,成为了性能瓶颈。
  • 分布式事务中RPC请求是串行处理,请求响应时间长

Hmily总结

实现TCC模式

优点

通过注解的形式声明TCC的的confirm与cancel方法,代码入侵性较小。

缺点

  • 多线程的锁机制有待优化。
  • 分布式事务中RPC请求串行处理,请求的响应时间长

ByteTCC总结

实现TCC模式
很遗憾,因为demo代码的问题再加上我们时间有限,本次未能对此框架完成有效测试。希望作者有空改善一下demo代码的问题,我们会在后续补充本框架的测试结果。

分布式事务与本地事务对比

经过测试,使用以上几种框架实现分布式事务的性能比本地事务的性能要差的多,从这一结果可以看出不通过消息队列实现的分布式事务处理性能都远不如本地事务,从这个层面也进一步说明了微服务设计中应尽量避免分布式事务的必要性。
在下一轮测试中我们将测试基于消息中间件的异步化会分布式事务的性能方面会有怎样的改善。

分布式事务TCC框架-hmily(spring cloud feign) 官网案例: 文档(springcloud):https://dromara.org/zh/projects/hmily/user-springcloud/ 官网示例:https://github.com/dromara/hmily/tree/master/hmily-demo/hmily-demo-springcloud 本示例:https://codechina.youkuaiyun.com/wwwzhouzy/zhouzy-hmily 一、说明 hmily是一个高性能异步分布式事务TCC框架,具有以下.. 阅读详情

相关推荐

基于Spring Cloud的两阶段提交分布式事务框架

缘起 现在用的比较多的分布式事务方案主要有TCC和可靠消息。TCC需要对业务进行改造,分别实现try/confirm/cancel方法,侵入性太强,工作量大。而可靠消息主要适合可以异步调用的业务,对于需要跨服务同步调用的业务,实现困难。以订机票为例,从深圳->新疆乌鲁木齐,假设没有直达,第一步先要确定中转地,选择一家航空公司订票,假设这步的订票结果是成功调用南航的服务订到了深圳->西...

饭西饼 6190

手写分布式事务框架,byte-tcc作者给出的9条建议!

本文作者:Eray一个TCC事务框架需要解决的当然是分布式事务的管理。关于TCC事务机制的介绍,可以参考TCC事务机制简介。TCC事务模型虽然说起来简单,然而要基于TCC实现一个通用的分布式事务框架,却比它看上去要复杂的多,不只是简单的调用一下Confirm/Cancel业务就可以了的。本文将以Spring容器为例,试图分析一下,实现一个通用的TCC分布式事务框架需要注意的一些问题。一、TCC全局...

weixin_33709590的博客 1005

探秘Java领域Spring Cloud的分布式事务管理框架

在微服务架构日益普及的今天,一个系统往往由多个独立的服务组成,这些服务可能部署在不同的服务器上,通过网络进行通信。当涉及到多个服务之间的业务操作时,如何保证数据的一致性成为了一个棘手的问题。本文章的目的就是深入探讨Spring Cloud中分布式事务管理框架,帮助开发者理解其原理、掌握使用方法,从而能够在实际项目中有效地处理分布式事务。文章的范围涵盖了Spring Cloud中常见的分布式事务管理框架的核心概念、算法原理、实际应用场景等方面。

Java大师兄的博客 1127

分布式事务框架之ByteTCC

ByteTCC是一个基于TCC(Try/Confirm/Cancel)机制的分布式事务管理器。兼容JTA,可以很好的与EJB、Spring等容器(本文档下文说明中将以Spring容器为例)进行集成。 文档 & 样例 使用文档:https://github.com/liuyangming/ByteTCC/wiki 使用样例:https://github.com/li...

javaZhong的博客 5462

Spring Cloud分布式事务终极解决方案探讨

一 前言本话题已收入视频讲座《Spring Cloud分布式事务解决方案》大家不妨围观下阿里2017云栖大会《破解世界性技术难题!GTS让分布式事务简单高效》中,阿里声称提出了一种破解世界性难题之分布式事务的终极解决方案,无论是可靠性、还是处理速率都领先于市面上所有的技术。但令人遗憾的是一来项目未开源,二来还必须依赖阿里云的分布式数据库。毕竟,吃饭的家伙可不能轻易示人嘛。虽然如此,但《世界难题..

1万+

Java开发运用Spring Cloud实现分布式事务

在当今的软件开发领域,微服务架构已经成为一种主流的架构模式。Spring Cloud作为微服务架构的优秀解决方案,为开发者提供了一系列的工具和组件,帮助他们构建分布式系统。然而,在分布式系统中,事务管理是一个非常复杂的问题。因为在微服务架构中,一个业务操作可能会涉及多个服务的调用,如何保证这些服务的操作要么全部成功,要么全部失败,就需要引入分布式事务的概念。本文的目的就是详细介绍在Java开发中如何运用Spring Cloud来实现分布式事务。

Java大师兄的博客 1026

分布式事务

分布式事务,由一系列小的子事务组成。这些子事务,同大的分布式事务一样,同样要遵循ACID的原则。在一致性这个属性上,根据达到一致性之前所存在的时间,又分为强一致性和最终一致性(BASE)。 注意,对于子事务,这里有个小小的误解。并不是只有和数据库打交道的操作,才叫做事务。在微服务环境下,如果你通过RPC调用了另外一个远程接口,并造成了相关数据状态的变化,这个RPC接口,也叫做事务。 所以,在分布式事务中,我们把这些子事务涉及到的操作,叫做资源。当操作能正常完成的时候,根本不需要什么额外处理。事务主要

CNA_Gzy的博客 343

Spring Cloud Alibaba系列之分布式事务Seata

Spring Cloud Alibaba系列之分布式事务Seata。Seata是Alibaba开源的一款分布式事务解决方案框架,致力于提供简单易用,高性能的服务。Seata支持多种分布式事务解决方法,比如常见的TCC、XA、SAGA,同时还有独创的AT模式

Nicky's blog 2856

Spring Cloud 分布式事务 Seata

分布式事务是指事务的操作跨越多个独立的服务或数据库,要求所有操作要么全部成功,要么全部失败,以确保数据的一致性。Seata 提供了一种高效、易用的分布式事务解决方案,与 Spring Cloud 深度集成,能够满足大多数微服务架构中的事务一致性需求。通过合理地选择事务模式和优化配置,开发者可以在提升系统性能的同时,确保数据的一致性和可靠性。

Flying_Fish_roe的博客 2019

Spring Cloud在Java领域的分布式事务处理

随着微服务架构在Java领域的广泛应用,分布式事务处理成为系统设计的核心挑战。本文旨在系统梳理Spring Cloud生态中分布式事务的解决方案,深入解析技术原理并提供可落地的实践经验。内容覆盖理论基础、框架实现、实战案例与性能优化,适用于中高级Java开发者、架构师及技术决策者。基础理论:解析分布式事务核心概念与理论模型框架解析:深入Seata架构及核心事务模式实现实战指南:完整演示微服务事务管理的开发过程应用分析:典型场景解决方案与最佳实践未来展望:探讨云原生时代的技术挑战与发展方向。

AI开发架构师 1021

构建Spring Cloud 2.0下的LCN分布式事务框架

微服务架构是一种设计思想,它将一个大型复杂的应用程序拆分成一套小的、松耦合的服务。每个服务运行在独立的进程中,并且通常使用轻量级的通信机制,比如HTTP RESTful API。这样的设计使得微服务能够独立地部署、扩展和更新。两阶段提交是分布式事务领域中的一种经典协议。它将事务的提交过程分为两个阶段:准备阶段:协调者询问所有参与者是否准备好提交事务,并等待所有参与者的响应。提交阶段:如果所有参与者都准备好了,协调者会发出提交命令;如果任何一个参与者没有准备好,协调者则会发出回滚命令。

weixin_42601547的博客 992

Spring Cloud Alibaba —— 分布式事务组件

分布式事务组件

4万+

EasyTransaction:一种分布式事务解决方案(分布式事务),统一使用了TCC,SAGA,FMT(seatafescar自动补偿),可靠消息,补偿等功能;

简体中文 零,SEO 柔性事务,分布式事务,TCC,SAGA,可靠消息,最大努力交付消息,事务消息,补偿,分成事务,软交易,分配交易,补偿,自动补偿 本框架可一站式解决分布式SOA(包括微服务等)的事务问题。 一,由来及特性 这个框架是结合公司之前遇到的分布式事务场景以及支付宝程立分享的一个PPT <大规模SOA系统的分布式事务处理>而设计实现的。 本框架意在解决之前公司针对每个分散事务场景中都自行重复设计的中间状态,幂等实现及重试逻辑的状况。 采取本框架后能解决现有已发现的所有分布式事务场景,减少设计开发设计工作量,提高开发效率,并统一保证事务实现的可靠性。 特性: POSTJAR包即用,无需独立部署协调者,无需独立部署ZooKeeper(使用extensionsuite-database-starter时) 一个框架包含多种事务形态,一个框架搞定所有类型的事务 多种事务形态可混合使用

Spring Cloud整合Seata实现分布式事务

Spring Cloud整合Seata分布式事务框架 Seata:阿里巴巴开源的一款分布式解决方案,其前身是Fescar。官网:https://seata.io/zh-cn/index.html。 1. 添加依赖 <dependency> <groupId>com.alibaba.cloud</groupId> ...

XUDC的程序人生 5494

ICG cell如何通过Latch结构消除与门clock gating中的glitch?

本文深入解析了ICG Cell如何利用Latch结构解决传统与门时钟门控中的毛刺问题。通过将电平敏感锁存器与门控与门结合,ICG Cell将使能信号的变化严格限制在时钟低电平的安全窗口内采样和锁存,从而在时钟有效沿期间提供稳定的控制信号,从根本上消除了因信号延迟不同步而产生的glitch,确保了门控时钟的纯净与电路功能的可靠性。

weixin_29234423的博客 468

自动驾驶技术路线之争:纯视觉与多模态融合的成本与性能博弈

本文深入剖析了自动驾驶领域两大主流技术路线——纯视觉与多模态融合的本质差异。文章从成本结构、性能博弈与商业逻辑等多维度展开,揭示了纯视觉方案在硬件成本与数据算力投入上的权衡,以及多模态融合方案在安全冗余与感知稳定性方面的优势。这场技术路线之争,实则是车企在性能、成本与商业化落地之间寻求平衡的综合博弈。

weixin_29038303的博客 390
上一篇: HBase深度简介
下一篇: Hbase的Filter详解使用
琅琊山二当家
博客等级 码龄18年 447粉丝 322原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值