从一次接口超时看懂重试与幂等
接口超时并不一定代表操作失败。通过请求标识、幂等约束、结果查询和有边界的重试,可以减少重复提交,也让排障过程更清楚。

超时首先是一条观察结果
客户端发出请求之后,需要等待网络传输、服务处理和响应返回。任何一个环节变慢,都可能让等待先结束。因此,超时说明调用方没有按时拿到结果,不能单独证明服务端没有执行。比如提交一篇文章时,服务端可能已经创建记录,只是回执没有返回。此时立即再提交一次,就可能出现重复内容。
给一次业务操作一个稳定编号
重试应该延续原来的业务身份。可以在创建任务时生成一个请求编号,并在后续查询、重试和日志中沿用。服务端收到相同编号时,应先确认这是不是已处理的同一次操作。如果业务参数完全相同,可以返回原有结果;如果编号相同而参数不同,应明确拒绝,避免把不同操作误当成重试。
幂等需要服务端原子地保证
只在界面上禁用按钮,无法覆盖多设备、网络重发和进程重启等情况。服务端需要用唯一约束、事务或等价的原子操作,保证同一个业务编号只对应一次有效写入。检查是否存在与创建新记录必须属于同一个可靠边界,否则两个并发请求仍可能同时通过检查。
先查询,再决定要不要重发
当提交结果未知时,优先使用请求编号查询状态。已经成功的操作直接展示结果;仍在处理的操作继续观察;明确未接收或可重试的失败才允许重发。查询接口本身也应有超时和重试边界。一次查询失败不能自动改写已经确认的业务成功,更不能把暂时查不到当成从未提交。
把重试范围写清楚
短暂的连接失败可能适合退避重试,但权限不足、参数错误和账号限制通常需要先处理原因。达到重试次数或总时间上限之后,应保留可定位的请求编号与当前状态,让用户知道下一步该做什么。对结果未知的写入,说明“正在核对结果,请勿重复提交”比笼统提示失败更贴近实际。
让记录能够串成一条线
一条实用的排障记录应包含业务编号、阶段、开始与结束时间、结果码,以及是否已经跨过正式提交边界。接口地址可去除不必要的查询参数,敏感凭据和正文隐私应按规则脱敏。把这些信息串起来,才能区分上传失败、业务拒绝、响应丢失与结果查询异常。
文中示例用于说明软件工程方法,具体实现应结合系统的业务边界与平台规则。