栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

线程并发会造成什么问题,应该怎么解决(线程不安全会出现什么问题)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

线程并发会造成什么问题,应该怎么解决(线程不安全会出现什么问题)

高并发引起的线上问题的分析思路及影响结果

1、背景2、现象3、初步判断4、具体分析步骤5、解决方式6、日志分析7、对业务的影响

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 这个人加上了,涉及的租户比较多,问题让人头大。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/773534.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号