重试机制选择指南

发布时间:2026/9/2 17:26:01

重试机制选择指南
调用一个外部服务失败了第一反应是再试一次。这个直觉没错但「再试一次」从一句代码到生产可用的重试策略中间隔着好几层坑——每一层都是被上一层的代价逼出来的。起点固定次数重试最直觉的做法失败就重试重试 N 次还不行就放弃。foriinrange(3):try:returncall_api()except:continueraise够简单逻辑清晰。调用偶发失败的场景下完全够用。但它有两个问题。第一重试间隔是零。上一秒刚失败下一秒立刻重试被调方还没缓过来你又打过去了。如果被调方是因为过载才失败的零间隔重试等于火上浇油。第二重试会把延迟放大。一次调用 100ms重试 3 次最坏 400ms。调用方多等一会儿没关系但如果你在请求链路里这个延迟会传到用户那一端。指数退避别打太勤零间隔重试会加剧拥塞于是想到每次失败后等久一点再试。指数退避就是干这个的第一次等 1 秒第二次等 2 秒第三次等 4 秒——间隔指数增长。被调方如果是因为过载失败的给它喘息的时间别一上来就连着打。但这引入了新问题如果你有 10 个客户端同时调用同一个服务服务挂了10 个客户端都在等指数退避。第一次都在第 1 秒重试第二次都在第 3 秒重试——大家步调一致重试全挤在一起。服务刚缓过来一点一波重试又打过去又被压垮。这叫惊群效应。指数退避解决了「重试太频繁」但制造了「重试太整齐」。加抖动打散整齐的重试解决惊群的方法是给退避加随机性——抖动。本来第 2 秒重试加个随机偏移变成 1.7 秒或 2.3 秒。10 个客户端不再同时重试而是分散在一个时间窗口里。被调方收到的重试从「一波打过来」变成「陆续打过来」。抖动这步不起眼但关键。不加抖动指数退避只是把问题从「太频繁」推迟到「太整齐」加了抖动重试才真正分散开。代价是延迟变得不可预测。同一个请求你可能 2 秒重试成功也可能 5 秒才重试。对于需要确定性延迟的场景这个不可预测是新的麻烦。重试加超时一直不返回怎么办到目前为止重试策略解决的是「失败后怎么办」。但还有一个没解决「一直不返回怎么办」。被调方不一定每次都干脆地返回失败。更常见的情况是它卡住了——请求发出去不返回成功也不返回失败就这么挂着。你的重试逻辑根本触发不了因为还没收到失败信号。所以重试必须配合超时。单次调用设个超时超时了就算失败触发重试。否则一个卡住的请求能占满你的连接池后面的请求全排队。但超时设多少是个难题。设短了正常慢请求被误杀设长了故障时干等。而且超时和重试次数会叠加单次超时 3 秒重试 3 次最坏 9 秒。调用方愿意等这么久吗重试加熔断别把故障放大重试的本质是假设「失败是暂时的再试一次可能成功」。但如果被调方是真的挂了不是暂时抖动你的每一次重试都是在给一个已经死掉的服务发请求。更糟的是你的重试会放大故障。正常情况下一个请求打一次现在打三次。被调方本来就在勉强支撑重试让它雪上加霜。如果被调方还有下游重试的请求会一层层传下去把一个局部故障放大成全局雪崩。熔断就是干这个的连续失败到一定次数直接停止重试也不再发新请求快速失败。给被调方喘息的时间也保护自己不被拖死。熔断不是重试的替代是重试的刹车。没有熔断的重试是「无脑试到死」加了熔断的重试是「试几次不行就算了」。怎么选重试策略的演进是被代价一层层逼出来的固定重试太频繁 → 指数退避 → 退避太整齐 → 加抖动 → 还得防卡住 → 加超时 → 还得防放大故障 → 加熔断。但实际工程中你不需要每次都从零搭。大多数场景的答案是指数退避 抖动 超时 熔断用现成的库。Java 的 Resilience4j、Go 的 go-resilience、Python 的 tenacity都内置了这套组合。真正需要你自己想清楚的是这几个参数重试几次3 次是个常见值多了放大故障少了不够兜底。退避多久起步看被调方的恢复速度。秒级服务从 1 秒起步分钟级任务从 30 秒起步。超时设多长看调用方能接受的最长等待。链路越长单次超时要越紧给重试留余量。什么情况不重试不是所有失败都该重试。参数校验失败、权限不足重试一百次结果一样。只有「可能恢复的临时故障」才值得重试——超时、限流、网络抖动。非幂等的写操作更要慎重重试可能导致重复写入。最后一条最容易被忽略重试的前提是幂等。如果被调方不保证幂等重试可能把一次扣款变成两次。在重试之前先确认你的操作能不能安全地重复执行。

相关新闻

【量化系统从0到1】存储架构:不选择什么,比选择什么更重要

【量化系统从0到1】存储架构:不选择什么,比选择什么更重要

2026/9/2 17:26:01

这套系统是个人量化研究系统:单用户,日线级别,盘后批处理——每天收盘后拉数据、算因子、跑策略、出报告,只产出信号和分析报告,不做实盘下单。部署在一台 2 核、1GiB 内存的云主机上。 存储要装的东西按形态分是五类&…

Build Your Own Database学习笔记(第三章)

Build Your Own Database学习笔记(第三章)

2026/9/2 17:26:01

书本链接:03. B-Tree & Crash Recovery | Build Your Own Database FromScratch in Go 如何实现一棵内存中的B树? 实现B树,可以从B树的特性出发,B树是一种多路平衡查找树。“平衡”意味着树的高度将严格限制在O(log N)&…

ChatGPT Plus/Pro订阅后Codex CLI配置与排错全指南

ChatGPT Plus/Pro订阅后Codex CLI配置与排错全指南

2026/9/2 17:26:01

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Live机架搭建全攻略:从虚拟通道到效果器链的延迟排查实践

Live机架搭建全攻略:从虚拟通道到效果器链的延迟排查实践

2026/9/2 18:46:04

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

人工智能、机器学习与深度学习:核心概念解析与实战对比

人工智能、机器学习与深度学习:核心概念解析与实战对比

2026/9/2 18:46:04

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

AI叙事提示词拆解:从分镜脚本到TTS配音的完整生成管线

AI叙事提示词拆解:从分镜脚本到TTS配音的完整生成管线

2026/9/2 18:46:04

如果现在拿到这样一句话——“五岁时,我就立刻被西班牙人剪了朋克头发,当时我愁眉苦脸,被送到了欧洲演戏Leon,结果正当我与杀手里昂产生了感情时,娜塔莉波特曼将我替换了下来,下半部由她主演”——你会怎么…

Inno Setup安装界面美化实战:从默认风格到VCL样式定制

Inno Setup安装界面美化实战:从默认风格到VCL样式定制

2026/9/2 18:46:04

简介:一套专门用于InnoSetup安装与卸载界面美化的资源包,面向需要改善软件安装体验的开发者、界面设计师,以及基于NW.js框架打包应用的团队。资源包将设计、脚本与测试串联起来:其中包含二十个设计源文件,可以借助图像…

索引贴与标签贴的工程化应用:构建个人知识管理系统的九种方法

索引贴与标签贴的工程化应用:构建个人知识管理系统的九种方法

2026/9/2 18:46:04

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Nastool v2 部署实战:用 Docker 打造 NAS 全自动媒体管家

Nastool v2 部署实战:用 Docker 打造 NAS 全自动媒体管家

2026/9/2 18:36:04

每一位玩 NAS 的朋友,几乎都会经历同一个过程:装了群晖、飞牛、极空间或绿联,配好了硬盘,然后开始折腾下载、刮削、整理、推送。一开始手动操作还挺有成就感,时间一长就会发现,找资源、下载、改名、刮削海报…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/9/2 10:08:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/9/2 12:11:52

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/9/1 23:49:08

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

2026/9/2 0:04:59

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

2026/9/2 0:04:59

这次我们来看一个很实用的 DeepSeek 落地场景:用 DeepSeek 把英文视频字幕自动翻译成中文。具体案例是《恶魔君》1989 年第 28 集的英转中字幕任务,标题写得很直白,但背后其实是一整套可以复用的技术流程:字幕解析、模型调用、批量…

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

2026/9/2 0:04:59

当你家里摆着一台天猫精灵,却总希望语音助手偶尔“不正经”一点,不用官方腔回答问题,而是张口就接几句搞笑段子,会是什么体验?我最近动手验证了一下这个想法——没有去改装任何市面上现有的智能音箱,而是直…

远程协作的工作台整理

远程协作的工作台整理

2026/9/2 6:21:32

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/2 6:21:32

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/2 2:45:06

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…