如何Mock HTTP请求的第二次重试调用?
我的第一个项目:短信发送工具库开发
最近我在搞我的第一个项目——一个小型的短信发送工具库,已经给它加上了等待与重试逻辑:要是第一次请求没拿到成功状态,它会自动重试。
下面是向短信发送服务发起请求的核心HTTP逻辑,代码里的注释会一步步说明流程:
for { // 发送HTTP请求到短信服务 resp, err := HTTPClient.Do(req) // 检查请求是否成功,返回三个值:是否成功、查询结果的URL(若需异步校验)、错误信息 checkOK, checkSuccessUrl, checkErr := CheckSuccessStatus(resp, err) // 如果请求成功,直接跳出循环结束流程 if checkOK { break } // 处理错误情况:先判断是否是可重试的错误 if checkErr != nil { // 比如网络超时、服务5xx错误这类可重试的情况,就等一会儿再试 if isRetryable(checkErr) { time.Sleep(retryInterval) // 这里可以改成指数退避,比如每次等待时间翻倍 continue } // 像参数错误、权限不足这类不可重试的错误,直接返回错误 return checkErr } // 还有一种场景:请求没报错,但短信服务是异步的,需要轮询指定URL查状态 if checkSuccessUrl != "" { // 等待一段时间后发起查询请求 time.Sleep(pollInterval) req, _ = http.NewRequest("GET", checkSuccessUrl, nil) continue } // 兜底:如果所有情况都不满足,返回最终错误 return fmt.Errorf("短信发送重试多次后仍失败") }
关于重试逻辑的几个小建议
- 一定要区分可重试错误和不可重试错误,别对着参数错误死磕重试,既浪费资源又没用
- 记得加重试次数上限,不然遇到极端情况可能会无限循环
- 等待时间推荐用指数退避策略,比如第一次等1秒,第二次2秒,第三次4秒,这样能减轻短信服务的压力
内容的提问来源于stack exchange,提问作者diwakarb
相关产品推荐
相关产品推荐

