先看现象。搜索接口返回 JSON,CDN 按 URL 缓存但没有 Vary,A 用户搜「发票」的结果被缓存后,B 用户搜「退款」拿到的还是发票列表,前端展示全乱。
真正麻烦的地方在于,几个原因的现象几乎一样。响应没写 Cache-Control,CDN 按默认策略缓存了接口。少数情况下是Vary 只写了 Accept-Encoding,没按查询参数区分。
还有一种情况,缓存键忽略了 q 参数的大小写和编码差异。
直接请求接口看缓存头
curl -sI 'https://www.example.com/api/search?q=abc' | grep -Ei 'cache|vary'
接着确认 CDN 是否命中缓存
curl -sI 'https://www.example.com/api/search?q=abc' | grep -i x-cache
给接口加 no-store 并刷缓存
curl -X PURGE 'https://www.example.com/api/search?q=abc'
我习惯把每一步的执行时间和结果记在一边,后面复盘省事。
改之前我把相关日志按时间截了一段存着,事后对时间线用得上。
怎么算真的好了,看的是同一批现象。接口改成不缓存后,同一 URL 连续两次请求返回不同结果,前端串号现象消失。
补一句。搜索结果属于个性化内容,接口层加 no-store 比在 CDN 上配例外规则更可靠。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
