问题出现得很突然,日志倒是留得挺全。客户端对上游模型服务走 gRPC,retryPolicy 只列了 UNAVAILABLE,压测时上游回 RESOURCE_EXHAUSTED,请求直接失败,指标里重试次数始终为零。
刚开始盯着「重试只作用于一元调用,流式方法不适用」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。retryPolicy 的可重试状态码没包含 8。另一种情况是服务配置里的 maxAttempts 没有生效。
少数情况下是服务端没返回 RetryInfo 详情,客户端不知道等多久。
先用 grpcurl 复现并看状态码
grpcurl -plaintext -d @ localhost:50051 llm.Infer/Chat < req.json
随后把 8 加入可重试状态码
python grpc_cfg.py --add-code RESOURCE_EXHAUSTED --in grpc.json
补服务端配置后复测重试次数
python grpc_client.py --metrics --n 100
末了按 RetryInfo 给出的时长退避
python grpc_client.py --honor-retry-info
怎么算真的好了,看的是同一批现象。指标里重试次数大于零,最终成功率超过 99%,等待间隔与服务端建议一致。
这里还有个坑。gRPC 重试按状态码白名单生效,限流类错误默认不在名单里,需要手动加。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
