时间:2020-09-16 18:00
现象:现有系统order依赖系统agent-dubbo-api之后,线上发布之后,线上下单数据跑到了daily环境,并且查询只能查询到最新线上订单数据(因为现在连着的库已经是daily,所以线上下的单在daily查询到没问题),但由于先入为主,本身认为数据肯定落在线上库中,查询不到线上库之前的数据。举个例子🌰:未依赖agent-dubbo-api之前,查询数据10条9月15号的数据;依赖agent-dubbo-api之后,下了三单9.16的数据,再查询只能查到9.16号的三单,9.15号及之前数据全部没了
排查:
① 最开始我们排除agent的依赖之后,一切都回归正常,所以猜测是否是包冲突导致mybatis解析语句出错。于是进入日志查看打印sql,发现解析出来的sql和我们的sql和传入的参数是一致的,但是该sql在线上库查不出数据(因为此时连的是daily),很纳闷。
② 之后查询daily库订单数据的时候发现格式跟正式数据很像,查看插入时间,是系统发布之后产生的,询问运营和测试之后确认是正式库的单,为了保险起见,再查询了分佣服务走的是线上之后,得出结论:发布系统后的时间段下的单跑到了正式库。
③ 再次比对依赖agent之前和之后的包,比对方法:
-
新建一个分支master-fix
-
在idea终端中输入以下命令
mvn clean package -Dmaven.test.skip=true cd order/target jar -tvf order.jar >> masterfixjar.txt cp masterfixjar.txt ~/ -
切换到master分支,同样执行以上命令
-
将master.txt和masterfix放到beyond compare软件中进行比较
发现引入agent的fix分支多了一个动态数据源配置的包dynamicDataSource,查阅资料后有这种说明:由于依赖方的依赖比较复杂,依赖组织不够严格,项目满足了一些自动化配置,导致本来应该使用自己的数据源却使用了agent的数据源,刚好agent的多数据源中使用的是dev的配置文件但是连接的是daily的order库,因此导致线上的数据跑到了daily环境中,而去除agent依赖之后没问题。到此,问题解决。
经过此次问题的排查,也越发明白,当项目越来越复杂的时候,各种依赖关系也越发复杂,因此,在新启项目和开发项目的同时还是必须要遵守开发规范,这样才能更大程度的保证系统稳定和规避一些由于不规范操作带来的各种问题。