AFAgent Field Notes会员账号
知识目录选择核心方向与细分内容
Q34高级实现约 18 分钟

审批快照、持久化等待与一次逻辑恢复

审批等待三天后用户点了两次同意,怎样安全恢复 Agent?

考察持久化等待、一次性批准、过期校验和并发恢复。

Human-in-the-loop审批恢复竞态

知识内容核对 2026-10-03 · 原题来源核对 2026-10-02

本题目录

READ · UNDERSTAND · TRANSFER

阅读理解,按需巩固

我的笔记与复习 ↗

先沿着原理、问答和迁移案例阅读。需要检查理解时,再切换巩固练习或展开个人记录。

作答与个人记录

每次修改后的提交会保留为独立历史。掌握程度由你对照标准自评。

核心知识 · 审批快照、持久化等待与一次逻辑恢复

先理解核心原理

先备概念:可信审批身份、状态条件更新、恢复重入与幂等

批准授权的是一个具体、可审阅动作快照,等待期间它的内容、权限和外部条件都会变化。恢复须验证批准仍适用,并把重复回调归并为同一逻辑动作。

等待不需要进程持续活着

把 run、待执行动作快照、恢复点和审批状态持久化后释放 Worker。用户回调只是事件,调度器根据记录继续运行。内存 approved 标志或 sleep 三天不能支撑重启,也无法让其他 Worker 判断是谁批准了什么。

批准对象是动作语义

记录 action_hash、revision、审批者、范围、有效期与 operation_id。哈希应基于规范化后的完整业务参数,而不是只对页面标题计算;收件人、费用、对象范围和正文变化都可能改变动作。身份由认证系统验证,模型转述“用户已同意”不能创建有效批准。

恢复有两次验证

收到回调时验证批准者与待审版本,真正发送前再检查任务未取消、内容未变、当前权限和业务条件仍满足。用条件状态领取一次逻辑恢复,重复回调返回相同 approval_id 状态;执行失败仍依稳定操作键恢复,不能简单删除批准后再造新运行。批准消费与远端动作不是同一个事务,未知结果需对账。

中断位置不是程序计数器

LangGraph 中断恢复会从节点开头重入,interrupt 之前的代码会再执行。副作用放在独立可恢复步骤,或使用明确幂等保护,不能假定暂停在哪行就从哪行继续。验收双击、重复回调、参数更改、审批者离职、批准后取消和写工具成功未记录;判断一项逻辑批准产生的业务效果,而非 HTTP 只返回一次。

回到问题:怎样回答?

等待审批应成为持久化状态,不用进程睡眠保活。批准记录绑定运行、待执行动作摘要、版本、审批者和有效期,服务端以条件更新消费批准。双击或重复回调返回同一结果,不触发两次动作。恢复前重查权限、业务状态和内容版本;动作变化或批准过期时重新审批,恢复点前可能重跑的代码不能包含无保护的副作用。

实现与取舍

等待不占用工作线程

保存 waiting_approval、动作摘要、输入版本和恢复位置,然后释放 Worker。用户回调仅表达审批事件,调度器负责恢复任务。重启后仍能从数据库显示待审批项,不能把内存对象或 WebSocket 连接当唯一状态。长时间等待期间工具版本、权限和业务对象都可能变化。

批准与动作绑定

批准包含 approval_id、run_id、action_hash、revision、actor 和 expires_at。服务端从可信身份取得审批者,用条件写将 pending 转为 approved 或 consumed;相同请求重复到达返回已处理状态。批准不能被拿去执行另一个动作,也不能由模型转述“用户说可以”替代实际记录。

恢复时重新验证

检查任务仍在等待、未取消,动作摘要未变,批准有效且审批者仍具权限。对于暂停节点恢复时会重新进入哪些代码,要按所用框架版本验证,将副作用隔离在可幂等的步骤。领取恢复任务还需并发控制,双 Worker 不能因为都读到 approved 就同时执行。

失败时怎样收尾

若外部动作已成功但消费批准状态未写入,靠操作幂等键或回执对账确定结果,而不是再消费一次。测试双击、重复回调、撤销权限、修改参数、批准后取消和 Worker 宕机。每种情况都应有明确业务终态与可解释审计记录。

工程推演

场景
面试假设:审批报告发布三天后同意按钮被重复点击。
设计决策
持久化批准并按动作摘要验证,以条件更新领取一次恢复。
验证目标
最多产生一次逻辑发布,重复回调返回同一状态。
适用边界
外部发布是否可保证一次效果仍取决于幂等或回执机制。

连续追问与解答

沿着问题的前提和约束继续向下读。先理解参考解答,再尝试收起答案,用自己的话解释因果和取舍。

举一反三:条件变了,怎样推导?

先找出改变的条件,再判断原方案中哪些前提仍成立。下面的案例是教学推演,便于将原理迁移到新问题。

批准时价格锁定,恢复时失效

改变的条件:对象相同但商业条件变化

延伸问题:原批准酒店 500 元,三天后 650 元可继续吗?

推导与参考解答

动作金额和条款已经超出快照,重新审批或按用户预先明确的上限规则判断。批准状态为 approved 不能覆盖价格变化;重新查询报价并保存版本,再让用户审阅。若已有外部订单先对账,避免报价变化引发重复预订。

保持不变的原理:批准绑定具体条件,任务等待不会冻结外部世界。

审批可代理

改变的条件:原审批者不在线,另一人代点同意

延伸问题:持有审批链接是否足够?

推导与参考解答

链接定位待审项,身份和代理资格需服务端确认。记录实际 actor、代理关系与权限范围,核对同一动作快照;重复回调仍归同一批准。不可将共享链接当成无限 bearer 授权,尤其会产生外部效果时。

保持不变的原理:可访问审批入口不等于具备批准能力,可信身份与动作范围缺一不可。

易错点

  • 进程 sleep 等审批
  • 只记录 approved=true
  • 双击回调各自创建运行

参考资料

依据公开技术资料设计;参考资料支持技术机制,场景与评分标准为本站设计,不代表某公司面试原题。 新增问答与迁移案例用于原理讲解,来源核查与案例运行验证分别记录。

检查自己理解到哪一步

读完后可以对照这些标准解释原理、边界和取舍。掌握程度由你自评;需要进一步验证时,再完成下方小任务。

基础达标
设计可跨重启保留的等待状态,并独立验证审批身份。
中高级信号
能绑定摘要、有效期并处理重复回调。
资深信号
覆盖恢复重入、并发领取、未知副作用与权限变化。

巩固练习 按需完成 · 建议 15 分钟

给批准接口写条件更新伪代码,模拟两次同时到达的同意请求。

展开验收要求与检查点
  • 同一批准不重复消费
  • 动作变化会拒绝恢复
  • 已取消任务不重新启动

重点检查

  • 等待可跨进程持久化
  • 批准绑定动作并原子消费
  • 恢复前校验变化与并发