跳转到内容

状态与支持

几乎所有被报上来的故障都落在五种情况里,而且各有可区分的特征:

现象可能原因看哪一页
昨天还正常的调用返回 401 unauthorizedkey 被轮换、被停用,或某条代码路径漏了请求头认证
402 insufficient_balance余额不足以覆盖本次提交的预占账户与余额
请求返回 200,但什么都没扣费整个组合全部失败;HTTP 状态不等于结果计费与退款
同一个请求时而成功时而失败限流,或同一个 Idempotency-Key 被不同请求体复用限流规则、幂等与重试
批量任务停在 processing,last_progress_at 不再前进任务确实卡住了,而不是慢任务状态

最后一条值得说清楚:故障信号是时间戳停住,不是耗时变长。 一个 50 万行的任务跑很久是正常的;last_progress_at 不动的任务才是要升级的问题。

下面每个字段都是接口自己返回的,所以带着它们不增加你的成本,却能省掉一个来回:

带上从哪里来
request_id每个实时响应,包括带响应体的失败
task_id每次批量提交,以及每个任务状态响应
api_key_idGET /v1/api-key —— 在不暴露 key 的前提下指明是哪一个
确切的 HTTP 状态与响应体你自己的日志;尤其是其中的 code 字段
到秒的 UTC 时间戳你自己的日志
你发出的请求(key 打码)你自己的代码

绝不要在支持请求里粘贴 API key。api_key_id 已经能指明是哪个 key,而 key 本身能直接动你的余额。

账户级通告 —— 计划维护、容量降级 —— 会出现在控制台,余额与记录也在那里。同样的情况会以错误码而非散文的形式直接暴露给你的集成:

错误码对运行中的集成意味着什么
detection_capacity_unavailable当前没有检测容量。退避重试;未产生扣费。
realtime_route_unavailable没有可用的实时路由。退避重试。
realtime_rate_limiter_unavailable限流器本身不可用,无法做出准入判断。稍后重试。
realtime_fact_cache_unavailable某个实时依赖不可用。稍后重试。

这些都是 503,且都属于”等待后重试”组 —— 完整分组(包括哪些失败可以用同一个 Idempotency-Key 安全重试)见错误码。

有两个运维事实可以从外部验证,在提交故障前值得知道:

  • 接口部署在 Cloudflare 之后,所以网络路径与 TLS 终结由 Cloudflare 承担,而不是单台源站。
  • 每个响应都带 X-RateLimit-Remaining,所以会记录响应头的客户端可以自行区分「被自己的限额限住了」和「服务挂了」,不必问任何人。通用组与检测组的每个响应还带 X-RateLimit-Limit;实时检测不带,因为它消耗的是令牌桶,而不是固定的每分钟上限。
  • 错误码 —— 重试分组,最快的排查表
  • 安全 —— key 的处理、如何轮换、什么永远不要发出去