增量上线java代码引发的生产事故

事情起因

在一个月黑风高的晚上,运维说由于业务流程问题,智能运维告警太多,需要处理,同事就改了一点与业务无关的代码,直接把class文件扔上去。到了早上9点,上游通知整个上午都下单失败,吓得我们赶紧登上系统看,一看确实有问题。。。运维立马回滚到上一个稳定版本,然后我和同事去排查问题原因。

问题排查

因为本地和测试环境的流程是正常的,看样子是没啥问题的,后面模拟昨晚的操作把本地的文件增量上到测试环境上,就报错了,报的是下图的代码和错误。

NoSuchMethodError,找不到这个save方法??我看本地和服务器都有的......

后面再仔细对比,发现里面内有乾坤。本地和测试环境的工具类居然是不一样的。

本地save方法是有返回值的

测试环境反编译后的save方法是没有返回值的

也就是说本地service调用save是调有返回值的save方法,增量上上去之后就找不到有返回值的save方法。

看了增量上线的class文件,结果得到了实锤。

那么为什么两个文件会不一样呢??这就关系了打包工具jenkins。由于里面的工具包项目是放上去没有更新过了,可能是很旧的版本,后面我们本地的是新版本......

可以理解成jenkins save方法(测试、生产环境)是A版本,本地save方法是B版本,本地编译出来需要读取B版本的save,但是服务器只有A版本的save,就有问题了

如果一开始就是本地打包上生产,就是一直都是B版本,就算增量上线也是不会发生问题。

如果把jenkins的工具类更新到和本地一样的版本,增量上线也是没有问题。

总的来说就是由于增量上线,踩了jenkins和本地代码不一致的坑。

总结

主要是因为之前是很久以前的项目,没有用maven管理,导致版本不一致的问题发生。而且对于重要的业务修改还是要走正式流程,不踩坑也不知道改了一个无关紧要的代码会影响到关键业务。另外还是不推荐增量上线代码,因为是直接跳过了编译操作,这样会造成上面说的奇怪问题,如果是正常打包就会自动检查方法是否存在。一个问题的发生总是有多个小问题造成的,如果是某个环节做好了也不会发生这个事情,面对生产环境还是要小心谨慎。

相关推荐
顺风尿一寸34 分钟前
从 Java NIO poll 到 Linux 内核 poll:一次系统调用的完整旅程
java
流浪克拉玛依35 分钟前
Go Web 服务限流器实战:从原理到压测验证 --使用 Gin 框架 + Uber Ratelimit / 官方限流器,并通过 Vegeta 进行性能剖析
后端
程途知微37 分钟前
JVM运行时数据区各区域作用与溢出原理
java
孟沐39 分钟前
保姆级教程:手写三层架构 vs MyBatis-Plus
后端
星浩AI1 小时前
让模型自己写 Skills——从素材到自动生成工作流
人工智能·后端·agent
华仔啊3 小时前
为啥不用 MP 的 saveOrUpdateBatch?MySQL 一条 SQL 批量增改才是最优解
java·后端
武子康4 小时前
大数据-242 离线数仓 - DataX 实战:MySQL 全量/增量导入 HDFS + Hive 分区(离线数仓 ODS
大数据·后端·apache hive
砍材农夫4 小时前
TCP和UDP区别
后端
千寻girling5 小时前
一份不可多得的 《 Django 》 零基础入门教程
后端·python·面试
千寻girling5 小时前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法