一个请求,三道边界:浏览器、Worker 与上游服务
请求从浏览器经过边缘运行时再到上游服务,每一段都有自己的失败方式。把边界和状态说清楚,排查时才不会把猜测当成原因。
向下阅读
页面上一次加载失败,表面看只是一个红色提示,实际可能发生在完全不同的地方:浏览器没有发出请求,边缘函数拒绝了请求,上游服务没有响应,或者响应回到浏览器后解析失败。只看最终的“出错了”,很难知道该从哪一层开始检查。
把请求画成一条有方向的路径,会比把所有逻辑都称为“接口调用”更有帮助:浏览器负责发起请求和解释响应;Worker 或服务端负责身份、校验、限流和转发;上游服务负责提供最终能力。每一层应该只拥有完成职责所需的数据,也应该能清晰说明自己是否把请求交给了下一层。
沿着边界逐层确认
先检查浏览器是否发出了请求、目标地址和请求方法是否正确,再看响应状态和耗时。接着确认 Worker 是否收到请求、是否通过输入校验与额度检查,以及是否联系了上游。最后再查看上游返回的状态和服务端解析结果。这样的顺序能把“没发出去”“被本站拒绝”和“上游失败”拆成不同事实。
状态码也要配合边界理解。浏览器看到 502,并不自动说明上游是唯一问题:它可能来自代理层,也可能是 Worker 在处理上游响应时转换出来的结果。服务端可以记录一个内部错误类别,让公开响应保持稳定;排查记录则应注明错误发生在哪一段,而不是只记一串模糊的“请求失败”。
用关联标识串起一条路径
给每次请求生成一个不含个人信息的 request ID,并在本站各层传递。浏览器可以在出错时展示这个短编号;服务端日志用它关联入口校验、上游调用和最终响应。这样既不必把整段用户输入写入日志,也能找到这次请求走到哪一步。
日志字段应当有边界:记录时间、路由、阶段、状态码、耗时和受控错误类别通常足以定位许多问题;密钥、完整 Cookie、授权头和不必要的正文不应因为“方便排查”而顺手留下。若确实需要短期保存额外诊断信息,应明确保留期限与访问范围。
每一层都要给出可行动的结果
浏览器需要知道是否可以重试,Worker 需要区分输入问题、额度限制和上游不可用,上游错误也需要被本站安全地翻译。把这些边界写进接口约定后,界面就能提供正确的恢复办法,运维也能依据证据定位责任层。
一条请求并不是一个不可分割的黑箱。把路径拆成边界、让每一层留下有限且有用的记录,错误就从一句猜测变成可以验证的过程。