【现网】记一次并发冲突导致流量放大的生产问题

news2024/11/26 18:48:27

目录

事故现象

转账

业务背景介绍

背景一:转账流程

转账流程

转账异常处理

转账异常处理流程图

背景二:账户系统合并

实际全流程:

背景三:扣内存数据库逻辑

背景四:调用方重试逻辑

问题定位

总结

 资料获取方法


事故现象

生产环境,转账相关请求失败量暴增。

直接原因

现网多个重试请求同时到达 svr,导致内存数据库大量返回时间戳冲突。业务方收到时间戳冲突,自动进行业务重试,服务内部也存在重试,导致流量放大。

转账

首先我们一起了解一下转账。转账请求在支付场景中的应用频率非常高,它是现代金融系统中的一个核心功能。在日常生活中,个人和企业都需要进行各种不同类型的转账:

  1. 个人间转账:朋友、家人之间进行的转账,如还款、借款、生日礼物赠送等。
  2. 工资支付:企业向员工支付工资、奖金等。
  3. 税费缴纳:向政府缴纳所得税、增值税等税费、政府退回多征收的税费等。
  4. 跨境汇款:向国外的个人或企业进行的转账,如国际贸易、留学生汇款等。
  5. 投资与理财:向股票、基金、保险等金融产品进行的投资转账。
  6. 退款与赔付:商家或金融机构向客户退还购物款项、保险理赔等。
  7. ...

随着移动支付、网上银行等数字金融服务的普及,转账请求在支付场景中的应用频率越来越高。人们可以随时随地进行转账,这背后离不开金融科技的发展带来的更加便捷、安全、高效的转账过程。

业务背景介绍

背景一:转账流程

转账流程

转账常见流程:

转出方银行转入方...判断转账是否成功发起转账请求验证转出方信息验证转入方信息检查转账金额执行转账通知转账结果通知转账结果转出方银行转入方

转账异常处理

当支付渠道系统内部出现异常,比如给转入方转钱时遇到被调系统返回超时时:

  1. 系统自动重试: 在大多数情况下,支付渠道系统会在短时间内自动重试转账操作,以确保交易成功。通常,系统会在一定时间内尝试多次,直到转账成功或达到重试次数上限。

  2. 转账暂停: 如果系统在多次重试后仍然无法完成转账,支付渠道可能会暂停该笔转账。在这种情况下,会通知转出方关于转账暂停的原因,并可能建议转出方稍后再次尝试转账。

  3. ** 资金退回:** 如果系统在尝试一定次数后仍无法完成转账,支付渠道可能会将资金退回到转出方的账户。转出方可以选择在支付渠道系统恢复正常后重新发起转账。

  4. 客户通知: 在上述情况下,银行会通过短信、电话或电子邮件等方式通知转出方关于转账失败的原因。客户可以根据银行的建议采取相应措施。

  5. ...

总之,渠道会尽力确保交易的顺利进行。

转账异常处理流程图

转出方转入方MQ扣款成功,充值成功流程结束扣款成功,充值失败,重试成功流程结束扣款成功,充值失败,重试失败,退款流程结束扣款成功充值成功扣款成功充值失败推送消息发起重试重试成功扣款成功充值失败推送消息发起重试重试失败退款转出方转入方MQ

背景二:账户系统合并

因为公司账户系统存在多套,同一个服务商在不同的业务都存在商业合作时,账户归属不同的系统。降本增效大背景下,相关业务完成了业务账户的融合,将同一个商户在两个系统上的商户信息进行整合,融合到同一个账户,方便客户更好的维护,也方便客户账户资金共享,保证业务不中断。

改造后上层调用方会传递迁移前后两套uin的参数来进行调用,账户系统通过查询 uin 的映射关系和关系中的迁移状态判断实际操作的账户。

即两个不同入口的请求都需要先查询一次迁移关系,如果账户已经迁移,则使用迁移后的账户进行操作,这个逻辑同时适用于转出方 和 转入方, 所以流程图上加上了查询关系的逻辑 蓝色部分。

如果操作过程中,账户状态发生了变化,则内部进行重试。

转出方迁移关系转入方MQMQConsumer查询转入方、转出方迁移关系扣款成功,充值成功.......查询迁移关系返回迁移关系判断转出方实际抵扣账户查询迁移关系返回迁移关系判断转出方实际抵扣账户使用迁移后的转出方扣款使用迁移后的转入方充值转出方迁移关系转入方MQMQConsumer

实际全流程:

用户转出账户A转出账户A'充值账户B充值账户B'迁移关系MQMQConsumer查询转出方迁移关系流程结束alt[未迁移][已经迁移][迁移中]查询转入方迁移关系流程结束alt[未迁移][已经迁移][迁移中]查询转入方迁移关系流程结束流程结束alt[充值成功][充值失败]重试逻辑重写充值流水,流程结束流程结束alt[重试成功][重试失败]发起转账请求扣原账户扣迁移账户充值充原账户充迁移账户推送 MQ 重试推送MQ 重试查询数据存在重试数据发起重试重试充值对转出方进行退款,写退款流水用户转出账户A转出账户A'充值账户B充值账户B'迁移关系MQMQConsumer

背景三:扣内存数据库逻辑

为了支持高并发的需求,账户系统使用的是一个自研的缓存数据库,数据库内部有诸多逻辑,其中操作账户时,会先 get 数据,再 set 数据, get 的时候会拿到当前数据的的时间戳 和更新序列号,set 的时候,数据库会校验这个时间戳的合法性。

所以在请求出现并发时会出现这样的情况:

客户端1客户端2数据库数据已经被更新为时间戳t2get(键)上次更新时间戳t1, 值v1get(键)上次更新时间戳t1, 值v1修改值v1修改值v1set(键, 新值v1, 上次更新时间戳t1, 序列号1)检查上次更新时间戳t1结果(成功)set(键, 新值v2, 上次更新时间戳t1, 序列号1)检查上次更新时间戳和序列号结果(错误:时间戳冲突)客户端1客户端2数据库

背景四:调用方重试逻辑

调用方除非遇到订单重复、余额不足等明确错误,不然会推送 MQ 进行重试。

问题定位

相信大家看完上面的背景和前面的现象描述已经知道了问题的原因:业务的重试和系统内部的重试逻辑出现了重叠,导致了绝对并发(内存数据库的get\set逻辑极快),但是因为涉及到多个系统,每次请求的 uuid 又完全一致,导致了定位链路过长,定位难度增大。最后在测试环境复现了很多次才复现出来。

总结

针对这个问题给我总结了以下几点:

  1. 测试环境和生产环境的差异:测试环境很难完全模拟生产环境的各种情况,特别是在并发、性能和压力测试方面。因此,我们需要更加关注这些方面的测试,并尽量使测试环境接近生产环境。

  2. 完善的测试用例:在设计测试用例时,需要考虑各种异常情况和边缘条件,包括系统之间的相互调用、失败重试等情况。这样可以提高测试的覆盖率,降低类似问题的发生概率。

  3. 强化并发和压力测试:在软件测试过程中,应该重点关注并发和压力测试,模拟大量用户同时访问和操作,以便发现潜在的性能瓶颈和冲突问题。(常态化性能测试是一个非常好的切入点。后续会专门写一篇博客介绍如何进行常态化性能压测。

  4. 监控和日志分析:在生产环境中,应该加强对系统的监控和日志分析,以便及时发现并定位问题。同时,测试人员可以通过分析生产环境的监控和日志数据,了解系统在实际运行中的表现,从而改进测试策略。

以下是一些避免类似问题的发生的改进措施:

  1. 测试同学需要与开发团队紧密合作,了解系统架构和相互调用的关系,以便更好地设计测试用例。
  2. 在系统设计和开发阶段,可以引入容错和熔断机制,以应对失败重试和请求放大等问题。测试工程师需要关注这些机制的实现,并在测试中验证其有效性。
  3. 在测试计划中明确测试范围,包括并发测试、压力测试和性能测试,确保测试环境尽量接近生产环境,有条件的可以使用真实的数据和场景进行测试(现网引流)。
  4. 对于失败重试等可能会放大流量的逻辑,进行专项测试,模拟各种异常和故障情况(后续会专门写一篇博客介绍如何进行混沌注入),验证系统的稳定性和健壮性。

 资料获取方法

【留言777】

各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~

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

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

相关文章

org.apache.hadoop.hive.ql.exec.DDLTask. show Locks LockManager not specified解决

Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. show Locks LockManager not specified解决 当在Hive中执行show locks语句时,出现"LockManager not specified"错误通常是由于…

认识“协议“序列化和反序列化

目录 前言 1 应用层 2 在谈协议 3 序列化和反序列化 4 网络版计算器 4.1 指定协议 request结构体 response结构体 4.2 服务端编写 4.3 客户端的编写 5 Json for C 的序列化和反序列化使用样例 前言 之前的socket编程,都是在通过系统调用层面,…

acwing第 115 场周赛第二题题解:维护最大值和次大值

一、链接 5132. 奶牛照相 二、题目 约翰的农场有 nn 头奶牛,编号 1∼n1∼n。 其中,第 ii 头奶牛的宽度为 wiwi,高度为 hihi, 有一天,它们聚餐后决定拍照留念。 关于拍照的描述如下: 它们一共拍了 nn…

C++初阶语法——命名空间

前言:C,即cplusplus,顾名思义,是C语言promax版本,C兼容C语言。 C的诞生是因为贝尔实验室的本贾尼等大佬认为C语言的语法坑实在太多,拥有许多不足之处(比如命名冲突,)&…

Vue3 实现产品图片放大器

Vue3 实现类似淘宝、京东产品详情图片放大器功能 环境&#xff1a;vue3tsvite 1.创建picShow.vue组件 <script lang"ts" setup> import {ref, computed} from vue import {useMouseInElement} from vueuse/core/*获取父组件的传值*/ defineProps<{images:…

通信原理板块-书籍推荐及学习系列

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 关注公众号&#xff0c;后台回复通信…

在WebStorm中通过live-server插件搭建Ajax运行环境

1.下载node.js 官网: https://nodejs.cn/download/ 2.配置Node.js的HTTPS 使用淘宝的镜像&#xff1a; npm config set registry https://registry.npm.taobao.org 也可以使用cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org 配置之后可以验证是否成…

Linux(四)--包软件管理器与Linux上环境部署示例

一.包软件管理器【yum和apt】 1.先来学习使用yum命令。yum&#xff1a;RPM包软件管理器&#xff0c;用于自动化安装配置Linux软件&#xff0c;并可以自动解决依赖问题。通过yum命令我们可以轻松实现软件的下载&#xff0c;查找&#xff0c;卸载与更新等管理软件的操作。 最常用…

【Change】50 Matplotlib Visualizations, Python实现,源码可复现

详情请参考博客: Top 50 matplotlib Visualizations 因编译更新问题&#xff0c;本文将稍作更改&#xff0c;以便能够顺利运行。 1 Time Series Plot 时间串行图用于可视化给定指标如何随时间变化。在这里&#xff0c;您可以看到1949年至1969年间航空客运量的变化。查看此免费…

【Linux】socket编程简单的日志打印

1 UDP编程步骤 1.1 服务端 1.2 客户端 2 TCP编程步骤 2.1 服务端 2.2 客户端 3 日志打印

瑞吉外卖系统05

哈喽&#xff01;大家好&#xff0c;我是旷世奇才李先生 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】更有我为大家准备的福利哟&#xff0c;回复【项目】获取我为大家准备的项目 最近打算把我手里之前做的项目分享给大家&#…

算法通关村—轻松搞定二叉树的高度和深度问题

1.二叉树的最大深度 二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 1.1 递归 通过上面的步骤能够看出&#xff0c;深度取决于左右子树&#xff0c;只要左子树有&#xff0c;那么高…

java泛型和通配符的使用

泛型机制 本质是参数化类型(与方法的形式参数比较&#xff0c;方法是参数化对象)。 优势:将类型检查由运行期提前到编译期。减少了很多错误。 泛型是jdk5.0的新特性。 集合中使用泛型 总结&#xff1a; ① 集合接口或集合类在jdk5.0时都修改为带泛型的结构② 在实例化集合类时…

每日一学:什么是 Harbor ?

目录 什么是 Harbor &#xff1f; 一、Harbor 的优势 二、Harbor 架构构成 三、Core services 这是 Harbor 的核心功能 什么是 Harbor &#xff1f; Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;其目标是帮助用户迅速搭建一个企业级的 Docker Reg…

【论文阅读】EULER:通过可扩展时间链接预测检测网络横向移动(NDSS-2022)

作者&#xff1a;乔治华盛顿大学-Isaiah J. King、H. Howie Huang 引用&#xff1a;King I J, Huang H H. Euler: Detecting Network Lateral Movement via Scalable Temporal Graph Link Prediction [C]. Proceedings 2022 Network and Distributed System Security Symposium…

虹科分享 | 新时代“救命神器”:看AR眼镜如何应用于紧急救险场景

从工业时代到如今迎来的“体验时代”&#xff0c;体验即内容&#xff0c;5G、AI、空间计算技术的突破&#xff0c;为各行各业创建了丰富的内容体验模式&#xff0c;让人们能够听之、触之、与之交互。AR是体验时代最具潜力的新技术&#xff0c;在“应急”场景中更是成为了我们在…

政府大数据资源中心建设总体方案[56页PPT]

导读&#xff1a;原文《政府大数据资源中心建设总体方案[56页PPT]》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式&#xff1a; 如需…

字节大佬教你Python接口自动化测试(项目实战),一篇足矣

接口自动化测试是指通过编写程序来模拟用户的行为&#xff0c;对接口进行自动化测试。Python是一种流行的编程语言&#xff0c;它在接口自动化测试中得到了广泛应用。下面详细介绍Python接口自动化测试实战。 我也在文末准备的学习资料以及配套的视频教程&#xff0c;需要视频…

解读新东方Q4财报:银发经济能否造就下一个“东方甄选”?

8月1日下午&#xff0c;关停多日的东方甄选自营店铺抖音账号重新开播。尽管停播了26日至29日四天&#xff0c;但似乎并未产生太大影响。据东方甄选披露&#xff0c;7月29日的单日销售额已高达3500万元。 东方甄选长期稳定发展也使新东方受益。在“东方甄选自营产品”的抖音直播…

并查集维护额外信息,算法思路类似前缀和,结构类似扑克接龙

一、链接 240. 食物链 二、题目 动物王国中有三类动物 A,B,CA,B,C&#xff0c;这三类动物的食物链构成了有趣的环形。 AA 吃 BB&#xff0c;BB 吃 CC&#xff0c;CC 吃 AA。 现有 NN 个动物&#xff0c;以 1∼N1∼N 编号。 每个动物都是 A,B,CA,B,C 中的一种&#xff0c;…