2019-01-02线上问题排查

问题描述

第三方的用户A用户定了5笔订单,B用户定了1笔订单。但是订单中心收到的却是A定了4笔订单,B用户定了2笔订单。

初步排查

整个调用流程为
上游渠道->sdp->订单中心(本系统)->下游渠道
初步怀疑是sdp进行转发的时候导致了并发问题。所以就将sdp的日志进行查看排查,结果发现sdp的转发没有问题,所以开始进行订单中心的代码审查。

订单中心排查

因为是订单中心代码日志打印的时候,已经出现了入参替换,所以怀疑是在日志拦截器之前。刚好,在日志拦截之前有一个对request进行替换的动作发生了。所以查找这个类ChangeInVarsFilter。看到了他具体的替换逻辑如下图:


替换request代码实现

那么再次进入这个方法看到如下逻辑:


具体的获取Wrequest逻辑

看到这里,就发现了一个变量resourceStr,只有这个变量可能出问题了,因为其他的都是线程安全的。都是方法内变量。所以继续查看。
resourceStr的变量类型及初始化时机

看到这里,基本上也明白是咋么回事了。也就是resourceStr变量是一个静态变量,是共享资源。当线程a完成了对resourceStr的初始化的时候,还没有来得及做下面的动作,b线程进入,并且又对resourceStr进行了初始化。再接下来的动作中a线程中的变量resourceStr已经与b线程的一致。
至此,问题基本明了,接下来就是修改了。

问题解决

问题解决思路,将共享变量resourceStr变成对象的成员变量,如下图:


resourceStr实例变量

然后就方法也改为实例方法即可。改造完成。试了下效果没有问题。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,135评论 1 32
  • Java继承关系初始化顺序 父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父...
    第六象限阅读 2,172评论 0 9
  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 9,050评论 0 13
  • 女儿的舞蹈学校组织去凯光水上乐园表演。女儿说她很激动,晚上睡不着。我说其实只是换了个地点练习,在学校怎么跳...
    一本经典的书阅读 218评论 0 0
  • 公司:宁波大发化纤有限公司 姓名:冯玉停 期数:六项精进224期感谢二组学员,234期感谢三组志工,260期感谢一...
    尘埃wyzh阅读 88评论 0 0