API
速率限制
按账户计的限额在每个响应上都报出来,以及为什么裁决接口上的 429 是一次挂起而不是一次延迟。
响应头
每个响应都带着你当前窗口的状态。
| 响应头 | 含义 |
|---|---|
RateLimit-Limit | 本账户在当前窗口内允许的请求数。 |
RateLimit-Remaining | 当前窗口内剩余的请求数。 |
RateLimit-Reset | 当前窗口重置前的秒数。 |
在成功时就读它们,不要只在失败时读。一个从 429 才第一次知道限额存在的客户端,会在故障期间撞上限额——而那正是它最撞不起的时候。
超限时
429,type: .../rate-limited,带以秒为单位的 Retry-After。至少退避这么久,加抖动;在你这一侧用令牌桶,别用重试风暴。
裁决接口上的 429 是一次挂起
POST /v1/decide/deposit 返回一个带 fail_closed_action: HOLD 的独立 429 形状。
{
"type": "https://foreshock.org/problems/rate-limited",
"title": "Too many requests",
"status": 429,
"detail": "Rate limit exceeded. No verdict was produced; treat as HOLD.",
"request_id": "req_EXAMPLE0000000008",
"fail_closed_action": "HOLD"
}
没有产生裁决。等待不能替代裁决:无论退避跑多久,这笔入金在收到 200 之前一直是 HOLD。
把压力压下去
筛查比裁决便宜,A 层从不计费——但两者都受速率限制。两个习惯能把压力压下去:
- 每笔入金裁决一次,用稳定的
Idempotency-Key。重放很便宜且不再计费,但每次尝试换一个新键,会把一笔入金变成很多条裁决。 - 暴露面游标循环按稳定节奏跑,不要紧凑轮询。
next_cursor: null表示你已追平,睡一会儿再问。