从一次接口超时看懂重试与幂等

从一次接口超时看懂重试与幂等

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

upload-1794396351563.png

超时首先是一条观察结果

客户端发出请求之后,需要等待网络传输、服务处理和响应返回。任何一个环节变慢,都可能让等待先结束。因此,超时说明调用方没有按时拿到结果,不能单独证明服务端没有执行。比如提交一篇文章时,服务端可能已经创建记录,只是回执没有返回。此时立即再提交一次,就可能出现重复内容。

给一次业务操作一个稳定编号

重试应该延续原来的业务身份。可以在创建任务时生成一个请求编号,并在后续查询、重试和日志中沿用。服务端收到相同编号时,应先确认这是不是已处理的同一次操作。如果业务参数完全相同,可以返回原有结果;如果编号相同而参数不同,应明确拒绝,避免把不同操作误当成重试。

幂等需要服务端原子地保证

只在界面上禁用按钮,无法覆盖多设备、网络重发和进程重启等情况。服务端需要用唯一约束、事务或等价的原子操作,保证同一个业务编号只对应一次有效写入。检查是否存在与创建新记录必须属于同一个可靠边界,否则两个并发请求仍可能同时通过检查。

先查询,再决定要不要重发

当提交结果未知时,优先使用请求编号查询状态。已经成功的操作直接展示结果;仍在处理的操作继续观察;明确未接收或可重试的失败才允许重发。查询接口本身也应有超时和重试边界。一次查询失败不能自动改写已经确认的业务成功,更不能把暂时查不到当成从未提交。

把重试范围写清楚

短暂的连接失败可能适合退避重试,但权限不足、参数错误和账号限制通常需要先处理原因。达到重试次数或总时间上限之后,应保留可定位的请求编号与当前状态,让用户知道下一步该做什么。对结果未知的写入,说明“正在核对结果,请勿重复提交”比笼统提示失败更贴近实际。

让记录能够串成一条线

一条实用的排障记录应包含业务编号、阶段、开始与结束时间、结果码,以及是否已经跨过正式提交边界。接口地址可去除不必要的查询参数,敏感凭据和正文隐私应按规则脱敏。把这些信息串起来,才能区分上传失败、业务拒绝、响应丢失与结果查询异常。

文中示例用于说明软件工程方法,具体实现应结合系统的业务边界与平台规则。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容