CDN命中率可能按请求数、传输字节数或缓存对象数计算,三种口径回答的问题不同。少量大型文件命中,可能让字节命中率很高;大量HTML或小型API请求仍然MISS,用户体感和源站压力依旧不理想。排查前先确认报表的时间窗口、边缘节点范围、状态分类,以及是否把BYPASS、过期重验证、错误响应计入未命中。随后按内容类型、状态码、路径和流量来源拆分请求数与回源字节。总比例只是线索,不能单独说明缓存规则正确或错误。
缓存键通常包含主机名和路径,并按边缘配置选择部分查询参数、请求头或其他维度;具体组成取决于CDN产品与规则。对热点路径取一段有代表性的访问日志,按规范化后的路径和参数组合分组,再抽样比较原始URL、响应状态、缓存状态和响应正文摘要。抽样要覆盖高频项,也要覆盖长尾差异,例如同一路径下带与不带追踪参数、不同语言或不同图片尺寸的请求。
若?utm_source=a与?utm_source=b返回相同正文,却分别生成缓存对象,可评估从键中排除追踪参数;参数顺序只有在CDN会按原始字符串建键时才会造成分裂,应先用实际规则或日志确认。随机时间戳、会话标识等也可能带来大量一次性对象。相反,分页、语言、筛选条件和图片宽高若改变正文,就必须保留在键中,或通过等价且安全的规则区分。可把候选URL分成“正文相同”和“正文不同”两组,检查状态码、关键响应头及正文摘要;摘要相同是筛查信号,仍需留意压缩、个性化标记等响应差异。
对每个热点路径抽取约20至50条近期请求,并补入业务边界样本:默认参数、追踪参数、不同语言、不同分页和图片尺寸。逐条记录规范化路径、候选键维度、缓存状态、Age、状态码与正文摘要。先比较追踪参数样本:若正文与影响展示的响应头一致,而键不同,可在灰度规则中忽略该参数,再观察后续请求是否共享对象。随后比较语言或分页样本,确认它们仍落在不同对象。样本量应按流量和路径复杂度调整;小样本用于找假设,不能代替全量日志验证。
同时检查源站响应和边缘最终行为,重点关注Cache-Control、Set-Cookie、Vary、状态码及供应商的缓存状态标记。private通常表示不应由共享缓存复用,no-store要求不存储;Vary声明的请求头可能参与表示选择,但CDN是否据此建键仍由产品策略决定。带有Set-Cookie的响应也不一定在所有平台上自动绕过,必须核实实际规则。即使配置了TTL,源站指令、状态码策略或显式绕过规则仍可能令对象不缓存。
如果匿名公共页面因无关Cookie被绕过,先确认Cookie不会改变页面正文、状态或关键响应头,再小范围调整规则。登录、账户、购物车和个性化页面应继续采用合适的私有或不缓存策略。授权请求、用户身份、地域或实验分组若会影响内容,不能为了命中率把这些差异从键中删除,也不能把一个用户的缓存响应提供给另一个用户。
验收时分别请求同一公开资源两次:首次应符合预期的MISS或填充状态,随后请求应能复用对象;同时从不同边缘节点重复,考虑节点尚无对象或缓存已过期的正常情况。再用不同Cookie、语言、分页、筛选和图片尺寸请求,确认应隔离的变体仍返回正确内容。测试个性化或授权页面时,使用不同测试账户验证响应不会串用,并确认它们没有意外变成共享HIT。最后检查源站请求数和回源字节是否下降,动态API仍按预期回源,缓存刷新后新版本可见,错误响应也没有被错误地长期缓存。遇到持续MISS、BYPASS或EXPIRED,应分别回查键差异、绕过条件和TTL/重验证策略。目标是让内容相同且可共享的请求安全复用,而不是追求所有请求都命中。🎯