这是阿粉经历过最严重的一次生产事故了,说多了都是泪啊

Hello 大家好,我是鸭血粉丝,想必看到标题你们就猜到了,阿粉这次又写 bug 了,不过这次不是直接把服务器搞挂了,而是多写了一个判断导致线上业务接口少下放了一条链接数据,没有这个链接,就会导致线上的数据跟其他合作方对不上,换句话说就是会收不到钱!收不到钱意味着就是损失。

事故背景

事故的原因是新老系统的版本兼容没有做好,因为线上还是老系统,重构的新系统的设计跟老系统的设计有一点不一样的地方,所以接口处需要做兼容,接口的兼容本身没有问题,都很好处理,只是老系统的另一个功能会导致这个兼容失败。简单的业务是这样的,我们这有一张主表 A,里面关联了两个子表 B 和 C,老系统的设计是 A 和 B 是一一对应的,所有 A 表里面有一个 B 表主键字段,A 和 C 表是一对多,C 表里面存放了 A 和 B 的主键 ID,但是 C 表里面 B 表的主键在老系统里面是没有用上的。在我们新系统里面的设计做了调整, A 和 B 变成多对多了,这就导致我们在获取 C 表里面的数据的时候就不能简单的根据 A 表主键去获取,需要同时也带上 B 表的主键才能准确的拿到数据。

本身这个逻辑已经没有问题,导致问题发生的原因是我们系统里面有一个功能,这个功能是用来更换 A 表里面关联的 B 表数据的,也就是说我 A 表里面的记录 a1 以前可能关联的是 B 表里面的 b1,这个功能可以修改这个关联关系,把 b1 修改成 b2。在没有做接口兼容的情况下,这个是没有问题的,因为获取 C 表数据的时候只根据 a1 的主键 ID ,但是因为做了兼容同时还需要 B 表的主键才行,问题是在更改 a1 和 b1 的对应关系时并没有把 C 表里面的 b1 也换成 b2,这就导致在获取 C 表数据的时候获取不到,从而没有下放对应个链接数据。

更换 b1 为 b2 的这个功能是很早就做好的,一直使用没有问题,所以在做接口兼容的时候就忽略了这个坑,没有想到会被这个功能给影响到,测试的时候也忽略了,从而引发了这次的生产事故,导致出现了损失。

之所以会造成这么严重的事故是因为发现的比较晚,因为我们这边是有数据的,只是合作公司没有数据,所以只能是通过对方才知道有问题,我们这边看是没有问题,所以没有及时的发现,导致事故的时间持续比较久。发现问题后解决问题还是很快的,接到反馈后大概花了十几分定位和解决,然后及时验证并且全网发布。

工作几年阿粉多多少少也经历过几次生产事故,但是这次是最严重的,也是损失最大的一次了,虽然说开发难免会有 bug,但是阿粉还是内心愧疚的很,没有考虑到方方面面,从而导致了这次的事故,后续还是要更加的严谨才行。阿粉其实一直都很敬畏线上,毕竟线上环境的每一分每一秒都是钱,任何影响到线上环境的事故都是会造成损失的,只是损失有大有小而已。但是不管怎么样,我们还是要更加小心,平时开发的时候多思考,把尽可能会影响的地方都要想到,避免采坑。

写在最后

最后邀请你加入我们的知识星球,这里有 1800+ 优秀的人与你一起进步,如果你是小白那你是稳赚了,很多业内经验和干活分享给你;如果你是大佬,那可以进来我们一起交流分享你的经验,说不定日后我们还可以有合作,给你的人生多一个可能。

Java Geek Tech wechat
欢迎订阅 Java 极客技术,这里分享关于 Java 的一切。