前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库Agent 幂等键 设计 重试
AIAI Agent生产运行

为 Agent 的多步任务设计幂等键时,键应该包含哪些字段才能兼顾重试与人工重跑?

幂等键需区分任务逻辑身份与执行实例:键应含任务类型、业务主键、参数哈希,并用执行ID区分重试与人工重跑,确保副作用只发生一次。

前端进阶之旅 · 一题精讲更新于 2026.09.05
AI Agent#生产运行
先看核心答案
理解线索

逻辑身份与执行实例分离

  1. 任务类型区分不同种类的业务操作
  2. 业务主键如用户ID+订单号,锁定业务对象
  3. 参数哈希对调用参数做规范哈希,识别同诉求

执行ID必须由系统生成而非业务自带,否则无法区分重试与重发。

核心回答

先记住这个答案

设计幂等键时,核心是区分"重试同一逻辑任务"与"用户再次发起同一诉求"。键应由任务类型、业务主键(如订单号)、输入参数规范哈希构成逻辑身份;每次实际执行附加唯一执行ID,重试复用同一执行ID,人工重跑生成新执行ID但保留关联的原始逻辑键,从而允许存储层按逻辑键去重或覆盖。

  • 幂等键必须区分逻辑任务与物理执行
  • 重试复用执行ID,人工重跑新执行ID
  • 状态存储是幂等判断的关键条件

双层键:逻辑唯一性与执行唯一性

Agent任务往往是多步、多工具调用,失败可能发生在任意一步。重试时若不区分执行实例,可能重复扣款或重复发消息。键结构应为:逻辑键 = task_type + business_key + input_hash,执行键 = logical_key + execution_id。逻辑键用于幂等存储的查找,执行键用于标识一次具体尝试。

自动重试必须复用同一执行ID,因为它是同一次逻辑尝试的延续,状态机已记录已完成的步骤。人工重跑则生成新的执行ID,但保留相同的逻辑键,允许系统识别"同诉求的新尝试",可选择覆盖旧状态或提示冲突。参数哈希需要规范化顺序,JSON字段排序后哈希,避免键不稳定。

支付场景:自动重试与客服手动重放

输入:一次"转账"任务,业务键为user:123,order:456,参数为金额和账号。第一次执行中,Agent调用扣款工具成功了,但响应超时,系统判定失败并自动重试。若重试用新执行ID,会再次扣款;正确做法是复用同一执行ID,状态存储中已有"扣款已完成"的记录,直接从该步骤后继续。

如果用户联系客服要求重新执行,因为之前任务整体失败(比如后续步骤无法恢复),客服触发重跑。此时应生成新执行ID,并关联原逻辑键。存储层可根据逻辑键查询历史执行,人工确认后选择新执行覆盖旧状态,确保业务对象最终正确。

幂等键设计失效的边界

一是键在生成后就不可变,如果步骤中参数因外部变化而调整,逻辑键会变,导致无法关联旧执行。解决:将可变参数放在独立字段,只用稳定业务标识做逻辑键,变参记录在执行上下文中。二是人工重跑时若不区分"想强制重来"和"仅检查",可能误覆盖有效结果,需要增加人工确认标记。

三是分布式环境下,状态存储的写入必须原子,否则两个执行并发时可能都通过检查。代价是需要为每个Agent维护一个分布式锁或数据库事务。四是长时间任务中执行ID可能被重用,需保证ID全局唯一,通常由UUID生成。

回答前,多想一步

容易答错的地方

幂等键只用业务主键
如果同用户多次手动发起相同诉求,就会被误判为重试,导致后面的任务被拒绝。业务主键只能唯一标识业务对象,不能唯一标识用户意图。需加入请求来源或会话ID。
重试生成新键
把重试当成全新任务,新执行ID导致已完成的副作用无法被识别,重复扣款或重复写数据。重试必须复用执行ID,只有人工明确重跑才新生成。
试着用自己的话回答

面试官还会怎么问?

如何防止状态存储与工具调用之间的并发写导致重复副作用?

在写状态前获取分布式锁,且工具调用的执行必须与状态更新在同一事务中,或采用两阶段提交。否则两个执行并发时都会通过检查而重复调用。

人工重跑时,旧执行留下的部分副作用如何处理?

优先通过业务键定位并补偿(如退款),但有些副作用不可逆(如发邮件)。此时应在逻辑键下记录全部已完成动作,供人工决定。

如果输入参数中含时间戳,每次都变,如何生成稳定的逻辑键?

从参数中提取业务核心字段(如订单号、用户ID),时间戳作为执行上下文而非键的一部分。否则逻辑键每次不同,无法识别同诉求。

从一道题,走向一组知识

把知识连起来

生产运行

Agent 任务反复失败进入死信队列后,恢复流程应该怎么设计而不是简单重投?

同属「生产运行」专题,接着看 Agent 死信队列 恢复 重放 在具体场景中的处理方式。

生产运行

LLM 提供商标的速率被打满时,Agent 队列消费者应如何把背压传导回生产端?

同属「生产运行」专题,接着看 Agent 队列 背压 限流 生产者 在具体场景中的处理方式。

参考资料

  • Building effective agents

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 双层键:逻辑唯一性与执行唯一性
  3. 支付场景:自动重试与客服手动重放
  4. 幂等键设计失效的边界
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑