boto3 1.34 的 client.invoke_model 调 anthropic.claude-3-5-sonnet,压测到 40 QPS 后稳定返回 ThrottlingException: Too many requests, please wait before trying again,客户端重试 5 次全部失败。

一开始怀疑是「没有开 adaptive 模式,节流时不会自动降速」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。botocore 默认 retry mode 是 legacy,最多 5 次且间隔很短。还有一种是并发线程数超过了账号在该区域的每秒请求配额。

不容易想到的是,多个线程共享一个客户端,连接池被打满后等待时间也被算进超时。

上来先看客户端当前的 retry 配置

python -c "import boto3;c=boto3.client('bedrock-runtime',region_name='us-east-1');print(c.meta.config.retries)"

随后切到 adaptive 模式并加大最大尝试次数

python -c "import boto3;from botocore.config import Config;c=boto3.client('bedrock-runtime',config=Config(retries={'max_attempts':10,'mode':'adaptive'}));print(c.meta.config.retries)"

再往下用一次最小请求确认配额是否真的耗尽

aws bedrock-runtime invoke-model --model-id anthropic.claude-3-5-sonnet-20241022-v2:0 --body fileb://req.json --region us-east-1 out.json

末了把并发从 40 降到 8 再压一轮看错误率

python bench.py --concurrency 8 --duration 60

别只看报错消失,验证要多做一步。并发降到 8 后 ThrottlingException 归零,adaptive 模式下偶发的两三次节流都在 2 秒内重试成功,P99 反而比 40 并发时更低。

节流不是靠加次数解决的,adaptive 模式的意义在于按服务端反馈主动降速,次数给太多只会把队列堆得更长。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189