首页缓存在整点过期,同一秒内 200 个请求全部回源,源站 QPS 从 300 冲到 2400,持续 8 秒,CPU 打到 95%。乍看像缓存或者权限的锅,追下去往往不是。

curl -sI https://example.com/ | grep -iE 'age|cache-control|x-cache'
# 过期时间加 0-60 秒随机偏移

追下去是这么回事:边缘节点没有开启请求合并,每个未命中的请求各自回源。过期时间又是统一的整点,所有节点同时失效。源站在最脆弱的时刻接到成倍的请求。

「回源合并」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

具体做法是,在 CDN 上开启回源请求合并 同一 URL 只放一个请求出去;过期时间加随机偏移 打散整点失效;源站加一层短时本地缓存兜底;压测时观察回源 QPS 峰值是否被压平。

验收就看一点,缓存过期后回源 QPS 峰值不超过平时的两倍 源站 CPU 没有明显抖动。

作者 9823189