先固定一个可核对的对象:把你正在处理的那个 URL 的搜狗收录提交记录、页面 HTML、CDN 边缘响应、应用层输出和数据库快照按同一时间点各取一份。比较它们的 Last-Modified、ETag、正文指纹和关键字段,找出哪一层先出现差异。不要从“收录没变化”倒推缓存有问题,先确认差异存在于哪一层,再决定是清缓存、改缓存键,还是修数据同步。
多层缓存下,同一 URL 可能同时存在浏览器缓存、CDN 边缘节点、反向代理、应用进程内缓存和数据库读副本。每个角色看到的“事实”不同,往往只是采样点不同。可以按下面的顺序取证据:
Cache-Control: no-cache,记录响应头和正文哈希。如果第 1、2 步正文不同,而第 3 步与数据库一致,问题集中在 CDN 或边缘缓存;如果第 3 步就与数据库不一致,说明应用层缓存或读副本滞后;如果第 3 步一致但第 1 步不同,则要检查浏览器或中间代理缓存。这个判断动作会直接改变下一步:前者改缓存键或刷新策略,后者查数据同步链路。
不同版本通常来自四类原因,它们留下的证据不同:
Cookie 或 User-Agent 请求时正文哈希变化,且 Vary 头缺失或与实际变化维度不符。区分这四类之后,处理动作完全不同:缓存键问题要补维度,刷新顺序问题要调整发布流程,读副本问题要改读写路由,构建残留要清理发布产物。把原因混在一起,容易反复清缓存却看不到稳定结果。
多个角色对同一事实理解不同时,不要争论“到底收录了没有”,而是把分歧写成一张可核对的表。每一行包含:采样点、请求时间、出口位置、请求头关键字段、响应状态、正文哈希、数据版本。让每个角色只填自己能看到的那一行。假设某次排查中,运维看到边缘节点返回版本 A,开发看到应用返回版本 B,数据侧看到版本 C,那么表里就会显示差异发生在应用层与数据层之间,而不是边缘节点。这个动作的结果是:讨论从“谁对谁错”转为“哪一层先偏离”,下一步只需要验证应用层读取的数据版本是否与主库一致。
核对时注意,请求量或抓取量下降不能单独证明缓存处理正确,它也可能来自提交配额、抓取调度或页面本身变化。同理,某个采样点暂时一致,也不代表所有边缘节点都已同步。
在搜狗收录提交语境下,还要确认搜索引擎抓取时拿到的是哪一版。可以查看服务器访问日志中搜狗抓取对应的响应状态、正文长度和缓存命中标记,与你自己采样的版本比对。如果日志显示抓取时命中了旧缓存,而源站已经更新,优先修正缓存刷新顺序和缓存键,而不是反复提交同一 URL。需要说明的是,站点地图不保证收录,robots.txt 的抓取限制也不等于可靠的索引移除;这些手段不能替代对版本一致性的排查。
如果页面同时存在 HTTP 与 HTTPS 入口,要分别核查两者返回的版本,因为不同入口可能命中不同缓存层。HTTPS 本身不保证内容一致,也不保证安全无漏洞或排名,它只是另一个需要纳入采样的入口。
假设某页面在 CDN 上配置了 10 分钟边缘缓存,应用层缓存 5 分钟,数据库读副本延迟约 2 秒。发布新版本后,你立即请求页面,可能看到:边缘仍是旧版,应用已是新版,数据库已是新版。此时若只刷新 CDN,应用层旧缓存仍可能在 5 分钟内被回填到边缘,造成版本回退。可执行动作是:先确认应用层缓存键是否包含版本号,再按“数据更新→应用缓存失效→CDN 刷新”的顺序操作,并在每一步后用正文哈希复核。若哈希在 CDN 刷新后仍回退,说明回填路径未切断,下一步应检查应用层是否在响应中设置了可缓存的公开头。
这个例子的数字只用于说明比较方法,不代表任何真实阈值。实际排查时,以你采样到的版本变化顺序为准,不要用固定时长推断因果。
当同一 URL 在连续多次采样中,边缘、应用和数据库返回的正文哈希与关键字段一致,且搜狗抓取日志中对应请求也命中同一版本时,可以认为一致性问题已收敛。此时再决定是否需要重新提交或调整抓取策略,而不是在版本仍不一致时反复提交。若仍有个别边缘节点不一致,记录节点标识和采样时间,作为下一次核对的起点。