【高并发线上问题】线程不安全引起线上问题的分析思路

1、背景

公司是做电商CRM方面业务,所在的数据平台组提供基于阿里PolarDB 存储提供近2年的热数据查询,构建了统一的主数据数据中台服务,供业务方查询自己需要的数据。热数据服务自19年发布上线后,陆续的对接了很多业务。因为业务的需要,公司的开放平台需要依赖热数据查询服务,进行id之间的转换。对接上线后,就有一家客户从一直在核对数据,发现了很多问题,包括程序的问题,方案流程的问题,一直在解决问题,但是数据的问题一直在发生着…

2、现象

最近客户给了一批异常数据,其中就有id转化有问题,id A没有找到对应的ID B, 反而找到的是ID C,也就是说id 转化串了,但是实际上是能转化成功的, 转化时序场景是如下:
在这里插入图片描述

3、初步判断

这个给人的第一印象可能线程不安全引起的问题,应该有个地方有共享变量。于是在本地多线程并发调用线上的转化api, 能复现问题。初步判断有可能是mybatis 的一级、二级缓存、或者分页插件Pagehelper 的问题

4、具体分析步骤

能复现问题就好办了,通过不断的添加日志,打印请求体和响应体,逐步的缩小排查范围。
1、将PageHelper 工具排除
依旧能复现该问题。
2、在调用mapper 方法之前和之后打印请求体和响应体
在复现问题后,发现请求体的ID 值已经被篡改了,基本找到问题了,是在调用mapper 查询方法之前,组装查询参数的时候,将参数值维护到了配置缓存里。终于找到原因啦!

5、解决方式

组装参数时,从配置缓存里获取表的配置时,进行深拷贝,然后将参数值维护在经过深拷贝后的局部变量里,这样打破了变量的共享。
本地多线程并发,未再出现问题。

6、日志分析

每天id 转化的请求量: 200w
有2059个请求, 占总请求的比例: 0.000970,接近千分之一

7、对业务的影响

当转换后的id 串了之后,拿到错误的id 继续做业务,会造成数据错乱,比如,给A这个人加积分,最后给B 这个人加上了,涉及的租户比较多,问题让人头大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值