写入工具超时后Agent反复重试,怎样避免同一动作执行多次?
写入请求超时后,结果应先标为未知,而不是直接判定没有执行。先通过业务记录或请求标识查询,再决定是否重试;支持幂等键的服务应为同一业务意图复用同一键。
先从这里排查
写入请求超时后,结果应先标为未知,而不是直接判定没有执行。先通过业务记录或请求标识查询,再决定是否重试;支持幂等键的服务应为同一业务意图复用同一键。单纯减少重试次数无法保证不重复,内存里的去重集合也不足以覆盖进程重启和并发。
把超时后的执行状态先标为未知
适用于创建记录、提交任务等动作没有及时收到响应,Agent于是反复发送相同操作。先保留请求时间、业务对象和可用标识,避免在调查前继续写入。这里的排查可以使用隔离测试环境;不应为了观察重复效果,向真实客户或生产系统再次执行同一动作。
确认业务意图和幂等键如何对应
先核对服务是否已经接受请求,查看已有资源或异步操作状态,而不是仅看客户端异常。再确认接口是否提供幂等机制,以及键对应的是一次业务意图还是每次传输尝试。相同键却改变请求内容时的处理也应核对,否则可能把不同操作错误合并。
持久保存键并先查询再安排重试
在发出首次写入前生成稳定业务键并持久保存,重试同一意图时复用它;服务需要负责识别并返回已有执行结果。设置有限重试与退避,响应丢失时优先查询状态。没有幂等支持且无法确认结果的接口,应停止自动重发并说明待核对,不能靠再试一次证明安全。
验证响应丢失与并发时仍不重复
在授权的测试环境中分别模拟执行前失败与执行后响应丢失,检查实际新增记录只有一份。重启客户端后重试同一业务键,也应能找到原结果。验证还需覆盖并发重复请求,以及同键不同内容被明确拒绝或处理的情况,不能只测试连续两次正常响应。
幂等不等于所有服务都能提供恰好一次的端到端执行,键的保存时间和查询能力需要按接口确认。本文没有执行真实写入或制造客户重复记录。若现有系统缺少可核对标识,只能报告执行结果未知;不能把错误被捕获或重试停止描述成业务已经恢复正确。
核对来源
以下资料用于核对概念和方法。文中的示例与测试范围分别注明,实际使用时请核对所用工具的版本。