先给一个有条件的结论:当同IP网站查询在不同网络、不同角色那里返回不同页面版本时,优先怀疑缓存键与缓存层级不一致,而不是先改内容。只有当所有角色的请求都经过同一入口、同一缓存键、同一份配置时,版本差异才更可能来自源站或发布流程。反例是:若其中一方走的是CDN边缘节点、另一方直连源站,那么版本不同属于预期现象,不能据此判断缓存配置出错。
同IP网站查询容易让人误以为所有请求路径一致,但实际至少有三层可能不同:DNS解析后的入口IP、反向代理或负载均衡的转发目标、应用容器实际监听的地址。三层中任意一层不同,返回的版本就可能不同。
可核对的动作:让每个角色提供请求时的完整链路信息,包括解析到的IP、是否经过CDN、是否带特定Host头。若两条链路的入口IP相同但转发目标不同,问题就落在负载均衡或容器层,而不是缓存层。这个判断会直接改变下一步:前者需要核对后端分组,后者才需要核对缓存键。
不要停留在“我看到的和你看到的不一样”,要转成可以比对的字段。至少记录以下内容:
Age、Cache-Control、ETag、Vary。假设一个短例子:A角色在10:00看到版本v1,B角色在10:02看到版本v2,两人入口IP相同。若A的响应头Age为3600,B的Age为0,说明B命中了新缓存或回源,A仍在使用旧缓存。此时应先核对缓存过期策略,而不是直接判定源站发布失败。这个动作的结果会决定下一步是清缓存还是查发布记录。
多层缓存中,边缘节点、反向代理、应用内缓存可能使用不同的键。边缘节点可能按URL加查询参数缓存,反向代理可能额外纳入Cookie或设备类型,应用内缓存可能只认内部对象ID。键不同,同一URL就会对应多个版本。
核对方法:分别从两个角色所在网络发起请求,保持URL、查询参数、请求头一致,只改变一个变量,例如Cookie或语言头。若改变某个头后版本切换,说明该头参与了缓存键。此时需要确认这是有意设计还是配置遗漏。若是遗漏,修正缓存键配置后,再让两个角色复测同一组请求,观察版本是否收敛。若版本仍不同,问题就上移到源站或发布流程。
出现以下情况时,缓存不是主因,继续查缓存会浪费排查时间:
这些情况下,先核对发布记录和分流规则,比清缓存更有效。清缓存可能暂时让版本一致,但会掩盖真正的分流问题,下一次发布仍会复现。
完成上述核对后,通常会落到两个分支之一:
无论走哪个分支,都要把“谁在什么时间、用什么请求、看到什么版本”写成可复核的记录。这样即使后续再出现版本差异,也能快速判断是新问题还是旧记录未清理。若记录显示同一请求在短时间内多次返回不同版本,且缓存键与发布记录均无异常,才需要进一步排查是否存在多套源站或数据同步延迟。