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