订单正向链路压测

这次压测会对正向链路中的生订单号、生成订单、预支付、支付回调四个接口做压测,其他接口或逆向接口并发要求不高,所以不做压测。

1、100并发压测4核8G(初步压测,看代码是否有问题)

压测结果:
可以看到,生成订单接口的请求成功率为100%,而提交订单、订单预支付、支付回调接口的成功率都是99.65%,且每个接口的TPS(每分钟处理的事务数)为89左右,其中响应时间比较耗时的是提交订单接口(该接口比较复杂所以很正常)

此时除了生成订单号之外的接口都有失败的情况,我们可以看看具体是什么错误。

1)、先看提交订单接口:

发现是扣减商品库存失败。那这个时候我们去看看数据库的数据是不是真的扣减失败了。

此时就可以知道真的扣减失败了。我们来看下扣减库存时我们的处理是怎么样的。

提交订单接口的逻辑:

1)、入参检查

2)、风控检查

3)、查询数据库,获取商品信息

4)、计算订单价格

5)、验证订单实付金额

6)、生成订单

7)、发送延迟消息用于支付超时自动关单

扣减库存在第6)点,我们看看第6点逻辑:

使用seata AT模式控制下面三个步骤

(1)、锁定优惠券

(2)、扣减库存

(3)、生成订单到数据库

再看看第2步,扣减库存是在AT的模式下,混用TCC模式。看看扣减库存的处理逻辑:

(1)、入参检查

(2)、查询mysql库存数据、查询redis库存数据

(3)、以订单号+sku Id为key做分布式锁防止并发

(4)、查询是否有扣减日志,有则不做重复扣减

(5)、执行库存扣减(TCC模式)

我们可以看到如果扣减失败只能存在第3、5步,先看第三步,第三步的设计是存在问题的,用订单号+sku作为分布式锁的key,此时可以防止同一订单中同一sku的并发问题,可是我们的需求是要做的不同订单的sku的并发问题,所以我们可以初步判断,库存数据错误可能就是分布式锁粒度的问题。此时我们就把key改为sku id再做一次压测。

----------------------------------------------修改完分布式锁key粒度后的压测分析

压测后查看数据:

发现仍然有数据错误,此时我们再去看第(5)步执行库存扣减(TCC模式)。看下处理逻辑

TCC的分支:1、扣减mysql库存  2、扣减redis库存

扣减mysql库存逻辑:

1)、try阶段:执行扣减库存数量

update inventory_product_stock
set sale_stock_quantity = sale_stock_quantity - #{saleQuantity}
where sku_code = #{skuCode}and sale_stock_quantity >= #{saleQuantity}and sale_stock_quantity = #{originSaleStock}

这里只对可售库存做扣减,而没有对已售库存做增加(放在commit阶段,为了模拟数据错乱问题)

2)、commit阶段:增加已售库存,并增加扣减日志

3)、rollback阶段:回滚操作(增加可售库存、删除扣减日志)

此时我们可以看到这里还涉及了另一个表扣减日志表,我们可以顺便看下这个表是否有数据错乱问题:

可以看到,库存数据依然不正确:已销售库存 + 未销售库存 != 总库存

并且increase_saled_stock_quantity(代表增加后的已销售库存,应改是10->20->30 递增)值就明显不对了,出现了重复的值。

扣减库存的TCC方案:

try阶段:扣减销售库存
commit阶段: 增加已销售库存,记录库存更新⽇志。
rollback阶段:增加销售库存,删除库存更新⽇志
第一个问题: 库存减扣⽇志不正确的问题原因: 因为commit阶段是有Seata Sever来触发的,是异步的
=====举个例⼦:
        有两个订单order1 和order 2 ,同时串⾏减扣sku 1 库存, 假设sku 1 的销售库存 = 1000 ,已销售 库存=0 . 假设order1 和order 2 竞争锁,order 1 获取了锁成功,order 1 查询到的已销售库存为 0 。order 1 减掉销售 库存,就结束,释放了锁,然后由seata在异步的去增加已销售库存由0 -> 1 , 假设此时seata server还没 有调⽤到commit⽅法,此时order 2 的请求过来了,查询到的已销售库存为 0 ,然后order 2 在commit阶段更新已销售库存还是0 -> 1 ,由此出现了上⾯的⽇志不正确的问题
第二个问题: 库存数据不正确的问题原因:是因为commit阶段是异步的 + 增加销售库存使⽤了乐观锁
======try阶段扣减可售库存时,sql加了sale_stock_quantity = #{originSaleStock}条件,
和前⾯例⼦⼀样,commit阶段是异步的,在commit阶段order 1 要更新已销售库存 0 -> 1 ,order 2 要更新的已销售库存0 -> 1 (和上⼀个例⼦⼀样)
第二个问题解决,去掉sql中sale_stock_quantity = #{originSaleStock}条件
第一个问题解决,
1)、将保存库存更新⽇志的逻辑 从 commit阶段移动到 try阶段
将product_stock_log的插⼊从LockMysqlStockTccServiceImpl 的commit⽅法移动到放在LockMysqlStockTccServiceImpl.deductStock()⽅法中(日志插入从commit阶段移动到try阶段)
2)、 库存扣减⽇志的原始已销售库存字段,需要从上⼀笔(最后一笔)库存扣减⽇志获取 (不能从库存表拿数据,并发时取到的数据是错误的导致插入的日志数据也是错的,所以我们会将日志插入操作放到try阶段,try完成后会将最新的库存数据保存到扣减日志表中,我们去扣减日志表中直接拿最新的库存日志即可)
3)、考虑回滚时,日志要如何操作,原先的逻辑是 rollback操 作会删除库存减扣⽇志,会导致库存减扣⽇志数据不正确。 (该问题未修复)
即A执行try做了日志插入后发生异常(10->20),此时进行rollback操作还没回滚完(20->10),B则去执行try去获取日志表数据(20->30),获取完后A就做完回滚了(A的日志被删除了),B执行成功则作日志插入(20->30),而正常情况下最后一条数据在A、B执行完后应该是20。
此时我们只能做到大部分数据不错误(即保证后面的数据不错乱),此时将回滚操作的删除日志修改为修改日志操作(修改最后一条数据,即将30->20,虽然这样A的日志还是错的,但此时C进来做交易的时候取到的日志是对的)
此时再做压测,发现数据都正常了。同样的道理,redis也会存在库存数据错乱的情况,,此时和mysql类似处理即可(redis没有日志错乱问题,只有库存数据错乱问题)

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

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

相关文章

网络协议--IP选路

9.1 引言 选路是IP最重要的功能之一。图9-1是IP层处理过程的简单流程。需要进行选路的数据报可以由本地主机产生,也可以由其他主机产生。在后一种情况下,主机必须配置成一个路由器,否则通过网络接口接收到的数据报,如果目的地址不…

python接口自动化测试(单元测试方法)

一、环境搭建 python unittest requests实现http请求的接口自动化Python的优势:语法简洁优美, 功能强大, 标准库跟第三方库灰常强大,建议大家事先了解一下Python的基础;unittest是python的标准测试库,相比于其他测试框架是python目前使用最广…

MySQL -- 库和表的操作

MySQL – 库和表的操作 文章目录 MySQL -- 库和表的操作一、库的操作1.创建数据库2.查看数据库3.删除数据库4.字符集和校验规则5.校验规则对数据库的影响6.修改数据库7.备份和恢复8.查看连接情况 二、表的操作1.创建表2.查看表结构3.修改表4.删除表 一、库的操作 注意&#xf…

蓝桥杯中级题目之组合(c++)

系列文章目录 数位递增数_睡觉觉觉得的博客-CSDN博客拉线开关。_睡觉觉觉得的博客-CSDN博客蓝桥杯中级题目之数字组合(c)_睡觉觉觉得的博客-CSDN博客 文章目录 系列文章目录前言一、个人名片二、描述三、输入输出以及代码示例1.输入2.输出3.代码示例 总…

muduo异步日志库

文章目录 一、日志库模型1.前端 参考 一、日志库模型 组成部分 muduo日志库由前端和后端组成。 muduo日志库是异步高性能日志库,其性能开销大约是前端每写一条日志消息耗时1.0us~1.6us。 采用双缓冲区(double buffering)交互技术。基本思…

蛇口街道小区长者服务示范点 ——在家门口“乐享晚年”

2023年9月28日,深圳市南山区蛇口街道创建健康街道行动之“老年肌少症免费筛查”项目走进了海昌社区,为数十位长者开展了系统筛查。在家门口就能够享受到由蛇口医院康复科医生提供的专业服务,这对于小区的老人们来说还是第一次。自今年7月以来…

【红日靶场】vulnstack5-完整渗透过程

系列文章目录 【红日靶场】vulnstack1-完整渗透过程 【红日靶场】vulnstack2-完整渗透过程 【红日靶场】vulnstack3-完整渗透过程 【红日靶场】vulnstack4-完整渗透过程 文章目录 系列文章目录描述虚拟机密码红队思路 一、环境初始化二、开始渗透外网打点上线cs权限提升域信息…

图(graph)的遍历----深度优先(DFS)遍历

目录 前言 深度优先遍历(DFS) 1.基本概念 2.算法思想 3.二叉树的深度优先遍历(例子) 图的深度优先遍历 1.图(graph)邻接矩阵的深度优先遍历 思路分析 代码实现 2.图(graph)邻接表的深度优先遍历 思路分析 代码实现 递…

京东数据分析:2023年9月京东洗烘套装品牌销量排行榜!

鲸参谋监测的京东平台9月份洗烘套装市场销售数据已出炉! 根据鲸参谋平台的数据显示,今年9月份,京东平台洗烘套装的销量为7100,环比下降约37%,同比增长约87%;销售额为6000万,环比下降约48%&#…

Rust-后端服务调试入坑记

这篇文章收录于Rust 实战专栏。这个专栏中的相关代码来自于我开发的笔记系统。它启动于是2023年的9月14日。相关技术栈目前包括:Rust,Javascript。关注我,我会通过这个项目的开发给大家带来相关实战技术的分享。 如果你关注过我的Rust 实战里…

Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现

可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个全文搜索引擎,它还提供了分布式的多用户能力,实时的分析,以及对复杂搜索语句的处理能力,使其在众多场景下,如企业搜索,日志和事件数据分析等…

后台交互-首页->与后台数据进行交互,wsx的使用

与后台数据进行交互wsx的使用 1.与后台数据进行交互 // index.js // 获取应用实例 const app getApp() const apirequire("../../config/app.js") const utilrequire("../../utils/util.js") Page({data: {imgSrcs:[{"img": "https://cd…

ROI的投入产出比是什么?

ROI的投入产出比是什么? 投入产出比(Return on Investment, ROI)是一种评估投资效益的财务指标,用于衡量投资带来的回报与投入成本之间的关系。它的计算公式如下: 投资收益:指的是投资带来的净收入&#x…

科学指南针iThenticate自助查重系统重磅上线

科学指南针,一直致力于为科研工作者提供高效、专业的学术支持,近日推出了全新的iThenticate自助查重系统。这一系统的上线,旨在为广大科研工作者提供更加便捷、准确的论文查重服务,进一步规范英文使用,提升科研质量。 …

PyTorch 与 TensorFlow:机器学习框架之战

深度学习框架是简化人工神经网络 (ANN) 开发的重要工具,并且其发展非常迅速。其中,TensorFlow 和 PyTorch 脱颖而出,各自在不同的机器学习领域占有一席之地。但如何为特定项目确定理想的工具呢?本综合指南[1]旨在阐明它们的优点和…

WebService SOAP1.1 SOAP1.12 HTTP PSOT方式调用

Visual Studio 2022 新建WebService项目 创建之后启动运行 设置默认文档即可 经过上面的创建WebService已经创建完成,添加HelloWorld3方法, [WebMethod] public string HelloWorld3(int a, string b) { //var s a b; return $"Hello World ab{a …

机器学习中的核方法

一、说明 线性模型很棒,因为它们易于理解且易于优化。他们受苦是因为他们只能学习非常简单的决策边界。神经网络可以学习更复杂的决策边界,但失去了线性模型良好的凸性特性。 使线性模型表现出非线性的一种方法是转换输入。例如,通过添加特征…

【面试经典150 | 区间】用最少数量的箭引爆气球

文章目录 Tag题目来源题目解读解题思路方法一:合并区间 其他语言python3 写在最后 Tag 【合并区间】【排序】【数组】 题目来源 452. 用最少数量的箭引爆气球 题目解读 每个气球都有一个占据x轴的一个范围,在这个范围里射出一只箭就会引爆该气球&…

C++笔记之关于函数名前的取址符

C笔记之关于函数名前的取址符 相关博文:C之指针探究(十一):函数名的本质和函数指针 code review! 文章目录 C笔记之关于函数名前的取址符一.函数名可以被视为指向函数的地址二.sayHello和&sayHello是不是等同?三.Qt信号与槽中的取地址符& 一…

2023全新小程序广告流量主奖励发放系统源码 流量变现系统

2023全新小程序广告流量主奖励发放系统源码 流量变现系统 分享软件,吃瓜视频,或其他资源内容,通过用户付费买会员来变现,用户需要付费,有些人喜欢白嫖,所以会流失一部分用户,所以就写了这个系统…