并发冲突导致流量放大的线上问题解决
事故现象
生产环境,转账相关请求失败量暴增。
直接原因
现网多个重试请求同时到达 svr,导致内存数据库大量返回时间戳冲突。业务方收到时间戳冲突,自动进行业务重试,服务内部也存在重试,导致流量放大。
转账
首先我们一起了解一下转账。转账请求在支付场景中的应用频率非常高,它是现代金融系统中的一个核心功能。在日常生活中,个人和企业都需要进行各种不同类型的转账:
个人间转账:朋友、家人之间进行的转账,如还款、借款、生日礼物赠送等。
工资支付:企业向员工支付工资、奖金等。
税费缴纳:向政府缴纳所得税、增值税等税费、政府退回多征收的税费等。
跨境汇款:向国外的个人或企业进行的转账,如国际贸易、留学生汇款等。
投资与理财:向股票、基金、保险等金融产品进行的投资转账。
退款与赔付:商家或金融机构向客户退还购物款项、保险理赔等。
...
随着移动支付、网上银行等数字金融服务的普及,转账请求在支付场景中的应用频率越来越高。人们可以随时随地进行转账,这背后离不开金融科技的发展带来的更加便捷、安全、高效的转账过程。
业务背景介绍
背景一:转账流程
转账常见流程
转账异常处理
当支付渠道系统内部出现异常,比如给转入方转钱时遇到被调系统返回超时时:
1、系统自动重试: 在大多数情况下,支付渠道系统会在短时间内自动重试转账操作,以确保交易成功。通常,系统会在一定时间内尝试多次,直到转账成功或达到重试次数上限。
2、转账暂停: 如果系统在多次重试后仍然无法完成转账,支付渠道可能会暂停该笔转账。在这种情况下,会通知转出方关于转账暂停的原因,并可能建议转出方稍后再次尝试转账。
3、** 资金退回:** 如果系统在尝试一定次数后仍无法完成转账,支付渠道可能会将资金退回到转出方的账户。转出方可以选择在支付渠道系统恢复正常后重新发起转账。
4、客户通知: 在上述情况下,银行会通过短信、电话或电子邮件等方式通知转出方关于转账失败的原因。客户可以根据银行的建议采取相应措施。
5、……
总之,渠道会尽力确保交易的顺利进行。
转账异常处理流程图
背景二:账户系统合并
因为公司账户系统存在多套,同一个服务商在不同的业务都存在商业合作时,账户归属不同的系统。降本增效大背景下,相关业务完成了业务账户的融合,将同一个商户在两个系统上的商户信息进行整合,融合到同一个账户,方便客户更好的维护,也方便客户账户资金共享,保证业务不中断。
改造后上层调用方会传递迁移前后两套 uin 的参数来进行调用,账户系统通过查询 uin 的映射关系和关系中的迁移状态判断实际操作的账户。
即两个不同入口的请求都需要先查询一次迁移关系,如果账户已经迁移,则使用迁移后的账户进行操作,这个逻辑同时适用于转出方 和 转入方, 所以流程图上加上了查询关系的逻辑 蓝色部分。
如果操作过程中,账户状态发生了变化,则内部进行重试。
实际全流程:
背景三:扣内存数据库逻辑
为了支持高并发的需求,账户系统使用的是一个自研的缓存数据库,数据库内部有诸多逻辑,其中操作账户时,会先 get 数据,再 set 数据, get 的时候会拿到当前数据的的时间戳 和更新序列号,set 的时候,数据库会校验这个时间戳的合法性。
所以在请求出现并发时会出现这样的情况:
背景四:调用方重试逻辑
调用方除非遇到订单重复、余额不足等明确错误,不然会推送 MQ 进行重试。
问题定位
相信大家看完上面的背景和前面的现象描述已经知道了问题的原因:业务的重试和系统内部的重试逻辑出现了重叠,导致了绝对并发(内存数据库的getset逻辑极快),但是因为涉及到多个系统,每次请求的 uuid 又完全一致,导致了定位链路过长,定位难度增大。最后在测试环境复现了很多次才复现出来。
总结
针对这个问题给我总结了以下几点:
测试环境和生产环境的差异:测试环境很难完全模拟生产环境的各种情况,特别是在并发、性能和压力测试方面。因此,我们需要更加关注这些方面的测试,并尽量使测试环境接近生产环境。
完善的测试用例:在设计测试用例时,需要考虑各种异常情况和边缘条件,包括系统之间的相互调用、失败重试等情况。这样可以提高测试的覆盖率,降低类似问题的发生概率。
强化并发和压力测试:在软件测试过程中,应该重点关注并发和压力测试,模拟大量用户同时访问和操作,以便发现潜在的性能瓶颈和冲突问题。(常态化性能测试是一个非常好的切入点。后续会专门写一篇博客介绍如何进行常态化性能压测。)
监控和日志分析:在生产环境中,应该加强对系统的监控和日志分析,以便及时发现并定位问题。同时,测试人员可以通过分析生产环境的监控和日志数据,了解系统在实际运行中的表现,从而改进测试策略。
以下是一些避免类似问题的发生的改进措施:
- 测试同学需要与开发团队紧密合作,了解系统架构和相互调用的关系,以便更好地设计测试用例。
- 在系统设计和开发阶段,可以引入容错和熔断机制,以应对失败重试和请求放大等问题。测试工程师需要关注这些机制的实现,并在测试中验证其有效性。
- 在测试计划中明确测试范围,包括并发测试、压力测试和性能测试,确保测试环境尽量接近生产环境,有条件的可以使用真实的数据和场景进行测试(现网引流)。
- 对于失败重试等可能会放大流量的逻辑,进行专项测试,模拟各种异常和故障情况(后续会专门写一篇博客介绍如何进行混沌注入),验证系统的稳定性和健壮性。
文中可能存在描述不正确,欢迎大神们指正补充!
实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。
如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步
在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。
我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,
测试开发视频教程、学习笔记领取传送门!!!
相关文章:

并发冲突导致流量放大的线上问题解决
事故现象 生产环境,转账相关请求失败量暴增。 直接原因 现网多个重试请求同时到达 svr,导致内存数据库大量返回时间戳冲突。业务方收到时间戳冲突,自动进行业务重试,服务内部也存在重试,导致流量放大。 转账 首先…...

Spring Cloud Gateway过滤器GlobalFilter详解
一、过滤器的场景 在springCloud架构中,网关是必不可少的组件,它用于服务路由的转发。对客户端进行屏蔽微服务的具体细节,客户端只需要和网关进行交互。所以网关顾名思义,就是网络的一个关卡。它就是一座城的城门守卫。所以这个守…...
【LeetCode】1281.整数的各位积和之差
题目 给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 示例 1: 输入:n 234 输出:15 解释: 各位数之积 2 * 3 * 4 24 各位数之和 2 3 4 9 结果 24 - 9 15示例 2&…...

22、springboot的Profile(通过yml配置文件配置 profile,快速切换项目的开发环境)
springboot的Profile ★ 何谓Profile 应用所在的运行环境发生切换时,配置文件常常就需要随之修改。Profile:——就是一组配置文件及组件的集合。可以整个应用在不同的profile之间切换(设置活动profile),整个应用都将使…...
2023-08-12力扣每日一题-暴力hard
链接: 23. 合并 K 个升序链表 题意: 如题 解: 时间668ms击败 5.00%使用 C 的用户/内存12.37mb击败 87.96%使用 C 的用户 循环选择插入新链表的节点,纯正的暴力,不过空间用得少 最坏应该是1E4*1E4,没…...

Mac安装nvm教程及使用
nvm 是 node 版本管理器,也就是说一个 nvm 可以管理多个 node 版本(包含 npm 与 npx),可以方便快捷的安装、切换 不同版本的 node。 1、直接通过brew安装 执行命令:brew install nvm PS: 如果没有安装br…...
左值引用和右值引用
目录 辨析引用和指针 代码段 定义引用变量的技巧 同一内存 指针和引用的简单运用 辨析两类指针 数组、指针、引用 辨析左值引用和右值引用 代码段 左值引用和右值引用 辨析引用和指针 1、引用是一种更安全的指针 说明:引用必须初始化,而指针可…...

JavaWeb 中对 HTTP 协议的学习
HTTP1 Web概述1.1 Web和JavaWeb的概念1.2 JavaWeb技术栈1.2.1 B/S架构1.2.2 静态资源1.2.3 动态资源1.2.4 数据库1.2.5 HTTP协议1.2.6 Web服务器 1.3 Web核心 2 HTTP2.1 简介2.2 请求数据格式2.2.1 格式介绍2.2.2 实例演示 2.3 响应数据格式2.3.1 格式介绍2.3.2 响应状态码2.3.…...
06-hadoop集群搭建(root用户)
搭建Hadoop集群流程 环境准备 1、基础环境的搭建(内网封火墙关闭、主机名、规划好静态ip、hosts映射、时间同步ntp、jdk、ssh免密等) 2、Hadoop源码编译(为了适应不同操作系统间适配本地库、本地环境等) 3、Hadoop配置文件的修…...
MySQL 窗口函数是什么,有这么好用
先看这段像天书一样的 SQL ,看着就头疼。 SELECTs1.name,s1.subject,s1.score,sub.avg_score AS average_score_per_subject,(SELECT COUNT(DISTINCT s2.score) 1 FROM scores s2 WHERE s2.score > s1.score) AS score_rank FROM scores s1 JOIN (SELECT subject, AVG(sco…...

用户数据报协议UDP
UDP的格式 载荷存放的是:应用层完整的UDP数据报 报头结构: 源端口号:发出的信息的来源端口目的端口号:信息要到达的目的端口UDP长度:2个字节(16位),即UDP总长度为:2^16bit 2^10bit * 2^6bit 1KB * 64 64KB.所以一个UDP的最大长度为64KBUDP校验和:网络的传输并非稳定传输,…...

STM32F429IGT6使用CubeMX配置外部中断按键
1、硬件电路 2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz 3、配置GPIO引脚 4、NVIC配置 PC13相同 5、生成工程配置 6、部分代码 中断回调函数 /* USER CODE BEGIN 0 */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if(GPIO_Pin GPIO_PIN_0){HAL_GPIO…...

时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测)
时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测) 目录 时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测)效果一览基本描述模型结构程序设计参考资料效果一览...
[开发|前端] 路由守卫笔记
描述 vue-router提供的导航跳转或取消的api。 router.beforeEach 切换路由前调用 router.beforeResolve 组件内路由守卫解析之后调用,和beforeEach用法类似 router.afterEach 切换后调用 全局路由守卫有上面3个,调用时机不同 路由守卫都有3个参数 …...

网络基础——网络的由来与发展史
作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 目录 一、网络的由来 二、计算机网络的发展史 1、第一阶段 2、第二阶段 3、第三阶段 前言 每天都是使用网络,那么你知道网络…...
八数码(bfs)
思路: (1)用string来存储状态,用d<string,int>来记录状态变换次数; (2)在bfs过程中,先初始化(q,d);每次拿出队头状态,得到x的相对位置&am…...

CCLINK IE FIELD BASIC转MODBUS-TCP网关cclink与以太网的区别
协议的不同,数据读取困难,这是很多生产管理系统的难题。但是现在,捷米JM-CCLKIE-TCP通讯网关,让这个问题变得非常简单。这款通讯网关可以将各种MODBUS-TCP设备接入到CCLINK IE FIELD BASIC网络中,连接到MODBUS-TCP总线…...

【Rust】Rust学习 第十一章编写自动化测试
Rust 是一个相当注重正确性的编程语言,不过正确性是一个难以证明的复杂主题。Rust 的类型系统在此问题上下了很大的功夫,不过它不可能捕获所有种类的错误。为此,Rust 也在语言本身包含了编写软件测试的支持。 编写一个叫做 add_two 的将传递…...

关于使用pycharm遇到只能使用unittest方式运行,无法直接选择Run
相信大家可能都遇到过这个问题,使用pycharm直接运行脚本的时候,只能选择unittest的方式,能愁死个人 经过几次各种尝试无果之后,博主就放弃死磕了,原谅博主是个菜鸟 后来遇到这样的问题,往往也就直接使用cm…...

Docker+rancher部署SkyWalking8.5并应用在springboot服务中
1.Skywalking介绍 Skywalking是一个国产的开源框架,2015年有吴晟个人开源,2017年加入Apache孵化器,国人开源的产品,主要开发人员来自于华为,2019年4月17日Apache董事会批准SkyWalking成为顶级项目,支持Jav…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...