AI 请求失败了,系统悄悄再发一次,这套动作叫重试机制。听起来就是“再试一遍”,门道全在细节:等多久再试、试几次、什么样的失败才值得试、原样重发还是换个姿势。设计得糙的重试,比不重试还糟。
重试不是原样重发
失败分类型,不是每种都值得重试。网络抖一下、服务端临时过载,这类瞬时故障重试命中率很高;参数写错、请求本身不合法,重试一百次也是白费,还会浪费资源。成熟的重试策略先给失败分类,只对可恢复的类型下手。
| 失败类型 | 是否值得重试 | 说明 |
|---|---|---|
| 网络抖动 | 值得 | 瞬时故障,重试命中率高 |
| 服务端临时过载 | 值得 | 等对方缓过来再发 |
| 参数写错、请求不合法 | 不值得 | 重试一百次也是白费 |
重试的节奏也有讲究。立刻重发容易撞上对方还没缓过来的峰值,指数退避是常见做法:等一秒、再等两秒、再等四秒,越挫越慢,给系统留恢复时间。再加一点随机抖动,避免大量请求整齐划一地重试,把恢复中的服务再次打爆。这条路重试不通,还可以换条路走,和回退策略配合使用。
像打电话没人接再拨
理解重试机制,可以类比打电话没人接再拨。响一声就挂和嘟嘟半天没人接,处理不一样:前者可能对方在忙,隔一分钟再拨;后者可能号码有问题,连拨几次无效应换联系方式。系统的重试策略也是这套判断:什么样的“没人接”值得再拨,拨几次该放弃。
重拨类比还解释了退避的必要性。对方正在开会,你每隔十秒拨一次,只会显得更烦;指数退避就是“知道你在忙,我过会儿再来”。系统对过载的服务端也是这个态度,给它喘息的时间,比穷追猛打更容易接通。
重拨类比的三处偏差
这个类比有三处对不上。其一,你重拨电话是手动且可知的,系统的重试自动且多数不可见,用户只看到“刚才失败了,怎么突然好了”,未必知道背后试了几次。其二,电话重拨不改变内容,系统的重试可能带着新状态,比如换了入口节点、换了参数重排。
其三,也是最要紧的:重拨顶多浪费你的话费,某些请求原样重发可能造成重复后果——同一个动作发两遍,就是事故。这类请求的重试必须配幂等设计,保证重复请求不出错,这是重试机制的安全前提。
重试失控的代价
重试最怕的是雪崩。服务端偶发卡顿,所有客户端同时重试,流量瞬间翻倍,服务端更卡,更多重试,恶性循环。防御手段是在客户端限制重试比例、在服务端限流熔断,双管齐下。另一个隐蔽风险是超时与重试叠加:请求其实成功了,只是回得慢,超时控制掐断后又发一遍,服务端处理了两回。
讯飞星火和 WPS AI 背后的服务体系都经历了大促级流量的考验,重试与限流的配合是基本功。对使用者来说,重试的存在解释了一种常见体验:失败提示刚出来,刷新一下忽然就好了。那不是运气,是系统在你看不见的地方又试了一轮,慢一点的那一下,往往就是重试在兜底,机制越完善,用户越无感。带走一个判断:重试是低成本换高可用,但无脑重试等于趁火打劫;先分类、再退避、配幂等,才是重试机制的完整形态。
速查表:重试=只对瞬时故障下手;节奏用指数退避加抖动;类比没人接再拨;必须配幂等防重复后果;忌同时重试引发雪崩。
关于重试机制的三个常问问题
- 重试次数越多越稳妥吗?不是,超过必要次数的重试只会放大负载,还可能造成重复处理。
- 为什么有时感觉答案慢半拍才好?大概率是首次失败后走了重试,多出来的等待藏在你没看见的地方。
- 所有接口都适合重试吗?不是,有副作用的动作必须先做幂等处理,否则重试等于重复执行。


