先做一件事:固定一个可复现的请求,把每一层缓存的响应版本号、时间戳和缓存状态头逐层记录下来。大多数“不同人看到不同速度”的分歧,根源不是测速工具不准,而是各层缓存对同一资源的版本判定不一致。把分歧转成可核对的记录,比继续争论哪次测试更准更有效。
两种情况的处理路径完全不同,先区分再动手。
判断依据很简单:对同一请求连续取两次响应,比较内容摘要而非耗时。摘要一致而耗时不同,属于测量问题;摘要不同,才进入多层缓存的版本排查。
如果 CDN、反向代理、应用层缓存和浏览器缓存都由同一团队管理,优先做逐层剥离。动作是:从最外层开始,依次绕过一层缓存直接请求源站,每绕过一层记录一次响应头中的版本标识和缓存命中状态。结果是你能定位到是哪一层保留了旧版本,下一步只需检查该层的缓存键组成和失效触发条件,而不用全链路重测。
如果其中一层由外部服务商控制,无法直接查看配置,选择带唯一标识的探测请求。动作是:在请求中附加一个每次不同的查询参数或请求头,观察各层是否把它纳入缓存键。如果加参数后各层都回源并返回一致内容,说明分歧来自缓存键设计;如果加参数后仍然返回不同版本,说明问题在更上游的内容分发或存储同步。这一步的结果决定你接下来是去推动缓存键调整,还是去核对源站的多副本一致性。
争论“哪个版本才对”没有意义,需要把事实固定下来。建议建一张核对表,字段包括:请求 URL、请求时间、响应状态码、内容摘要、缓存状态头、命中的缓存层标识、版本号或 ETag。每次有人报告速度异常,先填这张表,再比较。
关键动作是用内容摘要代替截图。截图无法证明两次请求是否命中了同一缓存层,而摘要可以精确比对。当两个角色的摘要不一致时,把两份记录并排放,差异字段就是排查起点。
还需要明确一个例外:如果站点对同一 URL 按设备、语言或登录状态返回不同内容,那么不同角色看到不同版本可能是设计如此,而非缓存故障。此时应先核对是否存在按请求头变化的缓存策略,再判断是否真的不一致。
以下现象容易被误读,需要结合其他证据:
这些现象只能作为线索,不能单独证明某一层处理正确或错误。要下结论,需要同时满足“内容摘要不一致”和“可复现的请求路径”两个条件。
假设某页面在 A 网络返回的 HTML 中引用了旧版脚本,在 B 网络引用新版脚本,两边测速结果差异明显。按上述方法:先在两个网络各取一次响应摘要,确认摘要确实不同;再在请求中附加唯一参数,观察是否仍返回不同版本。如果加参数后两边一致,说明分歧来自缓存键未包含某个变化维度;如果加参数后仍不一致,说明源站或中间存储存在多副本未同步。这个结果直接决定下一步是调整缓存键,还是排查存储同步机制。整个过程不依赖任何单次测速数字,只依赖可复现的版本记录。