API实践第2篇-2 细读超时与重试
第二篇超时和重试的细节AI接口超时和重试踩坑细节都在这了上一篇讲了三个基础配置这篇展开说超时和重试。一次请求涉及四种超时类型 含义 建议值连接超时 TCP TLS握手 5-10秒写入超时 发送请求Body 10秒读取超时 等待响应完成 60-300秒连接池超时 等空闲连接 10秒最容易出问题的是读取超时。模型生成是逐Token的长回复需要几十秒。读超时小于生成时间客户端先断。重试的五个注意事项区分错误类型pythonRETRYABLE {429, 500, 502, 503, 504}if status in RETRYABLE:retry()else:raise # 400/401/403不重试2. 不要立即重试至少等1秒给上游恢复时间。设上限最多三次超过就放弃并记日志。注意重复计费对话接口不幂等。重试一次多扣一次费。所以429/503要退避——上游可能已经处理了请求只是响应丢了。加随机抖动pythonwait (2 ** attempt) random.uniform(0, 1)避免多个客户端同时重试造成二次冲击。完整实现pythonimport timeimport randomimport logginglogger logging.getLogger(name)class AIClient:RETRYABLE {429, 500, 502, 503, 504}MAX_RETRIES 3def __init__(self): self.client OpenAI( base_urlhttps://api.openstarry.com/v1, api_keysk-xxx, timeouthttpx.Timeout(connect10.0, read120.0) ) def chat(self, messages, modelglm-5.2): for attempt in range(self.MAX_RETRIES 1): try: return self.client.chat.completions.create( modelmodel, messagesmessages ) except Exception as e: status getattr(e, status_code, None) if status not in self.RETRYABLE or attempt self.MAX_RETRIES: raise wait (2 ** attempt) random.uniform(0, 1) logger.warning(f重试 {attempt1}/{self.MAX_RETRIES}等待{wait:.1f}s) time.sleep(wait)我用国内聚合服务OpenStarry兼容OpenAI格式API可以先把代码跑通。