影刀RPA API调用的重试退避与超时策略
影刀RPA API调用的重试退避与超时策略作者林焱什么情况用这个调用外部API时有三种情况一定会遇到超时、限流、服务暂时不可用。如果每种情况都让流程直接报错中断那你每天有三分之一的时间在手动重启流程。API调用的稳定性不靠运气好不出错靠的是重试策略和超时控制的合理设计。这篇文章给你一套工业级的API调用封装让你的API请求能自动处理大部分常见问题。怎么做店群矩阵自动化突破运营极限基础封装importrequestsimporttimeimportrandomfromrequests.adaptersimportHTTPAdapterfromurllib3.util.retryimportRetrydefcreate_retry_session(retries3,backoff_factor1):创建带重试的requests Sessionsessionrequests.Session()retry_strategyRetry(totalretries,backoff_factorbackoff_factor,# 重试间隔: {backoff} * (2 ** (retry-1))status_forcelist[429,500,502,503,504],# 这些状态码自动重试allowed_methods[GET,POST]# 允许重试的方法)adapterHTTPAdapter(max_retriesretry_strategy)session.mount(http://,adapter)session.mount(https://,adapter)returnsession# 使用sessioncreate_retry_session()respsession.get(https://api.example.com/data,timeout10)自定义重试逻辑defapi_call_with_retry(url,methodGET,max_retries3,**kwargs):带智能重试的API调用forattemptinrange(max_retries):try:resprequests.request(method,url,timeoutkwargs.pop(timeout,10),**kwargs)# 限流 → 等服务器说的时长ifresp.status_code429:waitint(resp.headers.get(Retry-After,5))print(f被限流等待{wait}秒...)time.sleep(wait)continue# 服务器错误 → 退避重试ifresp.status_code500:delay2**attemptrandom.uniform(0,1)print(f服务器错误{resp.status_code}{delay:.1f}秒后重试)time.sleep(delay)continuereturnrespexceptrequests.exceptions.Timeout:ifattemptmax_retries-1:raiseprint(f超时重试{attempt1}/{max_retries})time.sleep(2**attempt)exceptrequests.exceptions.ConnectionError:ifattemptmax_retries-1:raiseprint(f连接失败重试{attempt1}/{max_retries})time.sleep(3)超时控制# 三层超时连接超时 读取超时resprequests.get(url,timeout(5,30))# 连接5秒读取30秒# 用Signal做硬超时防止requests卡死importsignaldefapi_call_with_hard_timeout(url,hard_timeout60):带硬超时的API调用——到时间强制中断signal.alarm(hard_timeout)try:returnrequests.get(url,timeout10)finally:signal.alarm(0)有什么坑坑一重试导致重复提交现象POST请求超时了但服务器其实已经处理了重试导致重复创建。解决POST/DELETE等非幂等操作默认不重试。或者用幂等键idempotency key防重。坑二错误的超时时间设置temu店群自动化报活动案例现象timeout设了60秒但平均响应时间就是1秒。超时请求要等60秒才知道失败了。解决超时时间 正常响应时间的5-10倍而不是越大越好。坑三重试次数太多导致雪崩现象多个流程同时重试同一个挂掉的API加重服务器负担。解决加入随机抖动jitter让重试时间分散delaybase_delay*(2**attempt)random.uniform(0,3)总结API调用的稳定性公式——合理超时 指数退避重试 限流遵从 非幂等不重试。把这四点封装成一个公用函数所有API调用都走它。