今天遇到一个奇怪的问题,为某java对象新加的属性在生产环境获取不到(一直为null)
现象:test、beta环境均为发现问题,一上线就出现,这种非线上环境不能重现的问题可最是折腾人
原因分析:
一、为什么online环境会出现这种情况
1)一般互联网服务online环境至少有2台服务器,本人这次负责的项目有6台服务器,一般情况下发布流程会先发布第一台,qa进行简单的冒烟测试
2)首台机器发完之后,运行的是最新的code,但是其他5台机器运行的仍然是上个版本的code,不巧的是此次的需求涉及到缓存,新老版本对应的相同的缓存key,首台机器一直拿缓存的数据,而老版本的code是不包含本次需求的内容,所以一直拿不到新添加的属性
3)有人会说,缓存也有个时间限制,时间一到,不就可以重新获取了。是的,而且我还告诉你这个缓存只有1分钟,首台机器要想获取到最新的对象,必须在缓存时间结束之后,抢在其他5台机器之前触发功能模块,否则一直拿的旧版本的数据。
4)有人会说,6台机器都发布完成,等一分钟,不就可以get到新数据了。这种方式可行,不过6台机器发布完成要10多分钟,官网首页是不允许10多分钟出现无图现象
二、为什么test、beta环境不出现这种现象
test、beta环境只有一台机器,当然不会出现这种情况了
三、解决办法
1- 最有效的办法,发布前把缓存的key置换成一个新的