上周三下午三点多,我正跑一个批量摘要任务,Claude Sonnet 4.6 突然开始疯狂返回 529。一开始以为是自己代码写崩了,看了下响应体才发现是 Anthropic 那边过载了:
{
"type": "error",
"error": {
"type": "overloaded_error",
"message": "Overloaded"
}
}
HTTP 状态码 529,Anthropic 官方文档里写得很清楚:这不是你的问题,是他们服务器扛不住了。但问题是——我的任务不能等啊。折腾了大半天,试了三种方案,记录一下。
为什么会出现 529
529 不是标准 HTTP 状态码,是 Anthropic 自己定义的。意思是"我知道你的请求没毛病,但我现在真的处理不过来"。跟 429(你请求太多被限流)不一样,529 是服务端容量问题。
常见触发场景:
- 新模型刚发布,全球开发者一窝蜂涌进去(Opus 4.7 上线那天简直灾难)
- 工作日下午 2-5 点(北美上午),高峰期
- 你用的是免费 tier 或者低优先级的 API Key
说白了,Anthropic 的服务器在忙,你排不上队。
方案一:指数退避重试
最朴素的办法。官方也推荐这么干。
import time
import anthropic
client = anthropic.Anthropic()
def call_with_retry(prompt, max_retries=5):
for attempt in range(max_retries):
try:
response = client.messages.create(
model="claude-sonnet-4-6-20260414",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}]
)
return response
except anthropic.APIStatusError as e:
if e.status_code == 529:
wait_time = (2 ** attempt) + random.uniform(0, 1)
print(f"529 overloaded, waiting {wait_time:.1f}s...")
time.sleep(wait_time)
else:
raise
raise Exception("Max retries exceeded")
实测效果:大部分情况下重试 2-3 次能过,等待时间大概 3-7 秒。但上周三那次高峰,我重试了 5 次还是 529,等了将近 60 秒才恢复。
问题:如果你是实时对话场景,用户等 60 秒肯定骂人了。批量任务还行,交互场景扛不住。
方案二:降级到其他模型
529 只是某个模型过载,不代表 Anthropic 所有模型都挂了。我的做法是检测到 529 就自动降级:
import anthropic
client = anthropic.Anthropic()
MODEL_FALLBACK = [
"claude-sonnet-4-6-20260414",
"claude-haiku-4-5-20260301", # 降级到 Haiku
]
def call_with_fallback(prompt):
for model in MODEL_FALLBACK:
try:
response = client.messages.create(
model=model,
max_tokens=1024,
messages=[{"role": "user", "content": prompt}]
)
return response, model
except anthropic.APIStatusError as e:
if e.status_code == 529:
print(f"{model} overloaded, trying next...")
continue
raise
raise Exception("All models overloaded")
这个方案 4 月 22 号那天帮我扛过去了。Sonnet 挂的时候 Haiku 还活着,虽然效果差一点,但至少业务没断。
问题:如果你的场景对模型能力有硬要求(比如复杂代码生成),降级到 Haiku 质量会明显下降。而且极端情况下 Haiku 也会 529——4 月 24 号 DeepSeek V4 预览版发布那天,感觉全球 API 流量都在暴涨,Anthropic 整个都不太稳。
方案三:走聚合网关做多通道容灾
这是我最后落地的方案,也是目前线上在用的。
思路很简单:不把鸡蛋放一个篮子里。聚合 API 平台后面对接了多个云厂商的 Claude 通道(AWS Bedrock、GCP Vertex 等),某一个通道 529 了,网关层自动切到另一个通道,对你来说是透明的。
graph LR
A[你的代码] -->|OpenAI 兼容协议| B[聚合 API 网关]
B --> C[Anthropic 官方直连]
B --> D[AWS Bedrock Claude]
B --> E[GCP Vertex Claude]
C -->|529| B
B -->|自动切换| D
我测试了 OpenRouter 和 ofox.ai 两家。OpenRouter 收 5.5% 手续费,ofox.ai 是 0% 加价直接对齐 Anthropic 官方价格,底层走的是 AWS Bedrock 和 Anthropic 的官方授权通道。改一下 base_url 就行:
from openai import OpenAI
client = OpenAI(
api_key="your-ofox-key",
base_url="https://api.ofox.ai/v1"
)
response = client.chat.completions.create(
model="claude-sonnet-4-6-20260414",
messages=[{"role": "user", "content": "hello"}],
max_tokens=1024
)
实测 4 月 22-24 号那波高峰期间,直连 Anthropic 官方断断续续 529 了十几次,走聚合网关一次都没触发。P95 延迟在 340ms 左右(香港),比直连官方还稳一点,我猜是因为 Bedrock 那边容量池更大。
问题:多了一层网关,理论上会增加几十 ms 延迟。但 529 直接超时 60 秒和多 30ms 延迟,选哪个不用想。
三种方案对比
| 方案 | 实现成本 | 529 恢复时间 | 适用场景 | 缺点 |
|---|---|---|---|---|
| 指数退避 | 10 分钟 | 3-60s | 批量任务、对延迟不敏感 | 高峰期可能一直失败 |
| 模型降级 | 30 分钟 | <1s | 能接受质量下降的场景 | 极端情况全挂 |
| 聚合网关容灾 | 改个 base_url | 0s(透明切换) | 生产环境、实时交互 | 多一层依赖 |
我的最终选择
线上服务用方案三兜底,代码里还是保留了方案一的重试逻辑作为最后防线。两层一起上,4 月份到现在没再因为 529 丢过请求。
我也不确定 Anthropic 什么时候能把容量问题彻底解决。从去年到现在,每次大模型发新版都会来一波 529 潮。作为调用方,能做的就是把容灾做厚一点。反正改个 base_url 的事,也不费什么功夫。