配置页加个"立即生效"按钮,我把缓存刷新写成了异步队列,结果前台读了旧值还以为是浏览器抽风

站长杂谈 2 浏览 0 回复 返回上级

上周给后台配置页做重构,想着把"保存并刷新缓存"做成一键搞定,用户体验拉满。结果上线第二天,运营在群里@我,说改了首页标题,前台刷新十遍还是老样子。我本地测了好几轮明明没问题,差点怀疑是CDN节点作恶。

查日志才发现,我把缓存刷新扔进了队列,表单保存走的数据库事务。这俩速度差了一个数量级——配置写进去了,缓存还在排队。前台请求先到了缓存层,读的自然是旧值。更坑的是队列偶尔积压,运营那边保存成功提示都弹了,实际生效要等半分钟,这半分钟足够她再点三次保存,生成三条版本记录。

后来改成同步刷新,但直接删缓存又扛不住并发。最后折中方案:保存时先写数据库,再同步刷新本地缓存,最后发一条消息让其他节点异步更新。本地保证强一致,分布式靠最终一致兜底。代码多了二十行,心里踏实了。

还有个细节踩了两次坑。配置项我一开始用json存,读取时`json_decode`没加`true`,结果某个版本升级后返回了对象,老代码里按数组取值直接报`Trying to get property 'xxx' of non-object`。现在强制规定:所有配置读写走封装好的`Config::get()`,内部统一处理类型,禁止业务层直接碰原始数据。

另外建议给配置表加个`env`字段区分环境,本地调测试配置不用改生产数据。之前没做隔离,凌晨调支付参数把线上网关地址覆盖了,幸亏有预发布环境拦了一道。现在配置页顶部加了环境标签,红色高亮,想无视都难。

评论0
回复 · 0
还没有回复
微信客服 微信客服