坑爹的问题 如何抽丝剥茧的debug

658 阅读3分钟

「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

debug犹如警察破案,抽丝剥茧,步步逼近问题的本质。

故事描述

我们客户端接口项目对项目配置参数做了缓存,以保证接口访问速度

管理后台可以对这些配置参数进行修改,当有修改时主动刷新缓存

这么简单且朴素的设计呀

问题描述

我花了不到一个小时就写完了功能,在本地环境测试没有问题,发布到代码到测试环境

测试环境运营妹子测试没有问题,发布到了预发布环境(预发布环境除了代码和生产环境不一致,其他都一致)

问题出现了:管理后台修改配置参数后,客户端没有变

image.png

排查问题

不科学这三个字在我脑海中萦绕

通过打Log的方式,我发现,管理后台主动刷新缓存了,且刷新缓存之后打印的数据是正确的。查看预发布接口,发现数据仍然不对。

活见鬼了哇

于是我再预发布环境,运行脚本刷新缓存,发现生效了,结果是正确的。

既然两个项目刷新缓存都成功了,但是管理后台刷新缓存之后,预发布接口获得的数据仍然不对,那问题就应该是key值不一致。

打印自己的key值,甚至搬出了文件助手比对,发现也一样啊。 (这时候我打印的key值,是我在业务代码中设置的key值)

难道有鬼,于是打开RDS检查一下,终于发现问题了。

发现问题

原因是我们设置的key值除了业务代码中设置的值之外,还会拿到.env配置文件中的APP_NAME在最前面拼接为前缀。

哇咔咔,两个项目的APP_NAME不一致!!!

解决问题

最简单的办法就是把APP_NAME改成一致的,因为管理后台是内部使用,且检查了缓存数据,除了这次的需求,之前没有缓存数据,所以就把管理后台的APP_NAME统一成客户端接口项目的APP_NAME

进一步思考

出现这种问题本身就是很不科学的,两个项目之间互相耦合,出现了相同的代码、配置参数在两个项目中重复定义的问题。

我们可以通过api调用的方式,解决问题,耦合的代码在客户端接口项目中统一管理,提供接口给管理后台调用,避免写重复代码。

我们还能使用更高级的办法,即通过rpc调用,之前写过一篇 go语言RPC调用的demo,大家感兴趣可以阅读。

Go RPC入门指南1:RPC的使用边界在哪里?如何实现跨语言调用?

image.png

总结

写代码1小时,debug2小时,这个小小的问题对我造成了很大的困扰。

但是抽丝剥茧,逐步定位问题的思路让我收益匪浅,分享给大家。

最后

欢迎大家关注我的微信公众号:程序员升级打怪之旅

同样欢迎关注我的专栏服务端从入门到精通,整理了深入浅出的服务端开发总结,包括:Go Java Php

如有问题可以加本人微信交流,微信号:wangzhongyang0601

👍🏻:觉得有收获请点个赞鼓励一下!

🌟:收藏文章,方便回看哦!

💬:评论交流,互相进步!