「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」
debug犹如警察破案,抽丝剥茧,步步逼近问题的本质。
故事描述
我们客户端接口项目对项目配置参数做了缓存,以保证接口访问速度
管理后台可以对这些配置参数进行修改,当有修改时主动刷新缓存
这么简单且朴素的设计呀
问题描述
我花了不到一个小时就写完了功能,在本地环境测试没有问题,发布到代码到测试环境
测试环境运营妹子测试没有问题,发布到了预发布环境(预发布环境除了代码和生产环境不一致,其他都一致)
问题出现了:管理后台修改配置参数后,客户端没有变
排查问题
不科学
这三个字在我脑海中萦绕
通过打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的使用边界在哪里?如何实现跨语言调用?
总结
写代码1小时,debug2小时,这个小小的问题对我造成了很大的困扰。
但是抽丝剥茧,逐步定位问题的思路让我收益匪浅,分享给大家。
最后
欢迎大家关注我的微信公众号:程序员升级打怪之旅
同样欢迎关注我的专栏服务端从入门到精通,整理了深入浅出的服务端开发总结,包括:Go Java Php
如有问题可以加本人微信交流,微信号:
wangzhongyang0601
。
👍🏻:觉得有收获请点个赞鼓励一下!
🌟:收藏文章,方便回看哦!
💬:评论交流,互相进步!