负载均衡导致的乌龙事件

572 阅读3分钟

一,案发背景

周五有业务组反映调用基础接口,多调用几次返回的数据不一致

二,技术栈

Springboot+Dubbo+Redis+Eureka+Gateway+Rocketmq+zookeeper

三,分析推理

 1,假设由缓存造成
 第一反应是接口有缓存,review code 未发现,使用Git 查看最近的提交记录发现有
 修改了调用方法,但是从没有使用过缓存.
 (脸上笑嘻嘻心里MMP的,代码没改过,有意思)
 
 2,假设是不是有旧代码的实例还在运行
 因为调用接口返回不正确的数据跟旧接口返回的很像,所以怀疑是有进程没kill干净,
 立马找到运维,要他帮忙查看,因为服务是运行在k8s容器上的,容器销毁会把对应的
 进程kill干净,抱着不死心调用指令再查看了一下,真是没有.(什么鬼)
 
 3,假设是不是有数据或者隐藏代码逻辑
 连接测试数据库,切换测试分支,运行程序,调用接口,5次,20次结果都一样,靠,本地
 没问题,线上有问题是最难搞的.(抓了抓乌黑浓密的头发),继续排查
 
 3,假设由开发同事连接测试环境的zookeeper造成的
 因为业务组同事是在测试环境演示的,会不会是开发同事排查问题连接到测试服务器,
 但是没有拉最新代码导致的呢?(之前就有同事连到测试服务器Rocketmq,导致测试环
 境的mq消费到本地)有可能,越想越可能,立马查看yml文件,尤其排查测试环境的配
 置,发现开发时zk连接的都是127.0.0.1,测试环境的zk地址只有运维知道.(难搞啊)
 但又不想放弃,因为是已经发布了预生产环境,在预生产环境调用同一个接口(wocao)
 还是出现了同样的效果,看来不是这个了.
 
 4,假设会不会是有开发同事连接到Eureka呢
 因为平时开发,虽然不用启动Eureka也不影响开发,但是异常的日志有时候就是比较
 烦人,会不会有洁癖的同事开发连上了呢,(有可能,抱有侥幸)打开网页
 

节点.png 都是一个节点,我承认我没招了!!--!!

   5,找运维了解一下最近的部署情况
   跟运维的交谈中得知是这个基础服务的配置一直没有动过,有配置的都是新服务.
   (新服务,脑子闪过一下,没抓住)继续了解,原来业务组在做应用拆分,将之前旧的
   大的服务按应用拆分,(拆分,我立马就有一个念头冒出)会不会是对应同事拆分服务
   没有拆分干净导致的呢?立马找对应对应业务同事.
   

四,结案

  在对应同事的电脑上review code 发现新拆分的服务里面果然有同一个接口的实
  现类(nima),这里就要涉及到了Dubbo 服务注册了,就是类的全名称+方法参数,实
  现类又一致,但还是旧接口的内容,难怪会出现莫名其妙的问题,让其修改后就没有
  出现了.(nice,老子果然牛逼,哈哈哈)

五,总结

    有时候很多莫名其妙的问题不是代码和配置的问题,就像这个问题,涉及基础组
    和业务组,这种跨组沟通的,信息不对称的就有问题.我的处理方式是,向其组
    长提醒,并且在会上把问题暴露出来,有拆分服务一定要认真再认真,并且一定
    测试再测试.