模板文件改成 v3 并发布,线上收到的邮件还是两周前的旧版式,重启服务后恢复正常,过一天又退回旧版。乍看像缓存或者权限的锅,追下去往往不是。
key = 'mail:%s:%s' % (name, os.path.getmtime(path)) cache.set(key, compiled, ttl=3600) # 发布后执行 python manage.py clear_mail_cache
追下去是这么回事:模板编译结果缓存在内存里,键名只有模板名没有版本,多实例部署时新实例读新文件旧实例还在用旧缓存。发布流程没触发缓存清理,重启只是碰巧换了一台机器。
碰到「邮件模板版本缓存」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
具体做法是,缓存键拼上模板文件的修改时间或 git hash,文件一变键就变;发布脚本里加一步主动清理模板缓存,别依赖重启;连续发两封间隔十分钟的邮件,确认两封都是新版。
验收就看一点,发布后十分钟内收到的邮件都是新版式,隔天再抽查仍是新版。
