先理解
刚接触这个知识点
补齐先备概念,读原理与反例,再用自己的话解释为什么。
从核心原理开始 →理解 → 实现 → 排错 → 取舍
考察持久化等待、一次性批准、过期校验和并发恢复。
知识内容核对 2026-10-03 · 原题来源核对 2026-10-02
建议先理解:
工具调用的结构、授权与业务契约 →按当前基础选择起点,也可以依次深入。遇到不熟悉的概念,先回到核心原理;完成后用知识练习检查理解。
LEARN · PRACTICE · REFLECT
先沿着原理、问答和迁移案例阅读。需要检查理解时,再切换巩固练习或展开个人记录。
核心知识 · 审批快照、持久化等待与一次逻辑恢复
先备概念:可信审批身份、状态条件更新、恢复重入与幂等
批准授权的是一个具体、可审阅动作快照,等待期间它的内容、权限和外部条件都会变化。恢复须验证批准仍适用,并把重复回调归并为同一逻辑动作。
把 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 宕机。每种情况都应有明确业务终态与可解释审计记录。
沿着问题的前提和约束继续向下读。先理解参考解答,再尝试收起答案,用自己的话解释因果和取舍。
第 1 层批准后正文修改一个字能沿用吗?
从批准绑定动作进入最小修改是否改变授权范围。
默认需要重新批准,因为快照改变。若产品明确允许不改变语义的格式规范化,可在审批前定义规范化规则并展示实际输出;不能在批准后临时判断“一个字没关系”。尤其金额、收件人、否定或链接变化须重新审核,内容版本与动作摘要一起校验。
沿着这个回答继续深入
第 2 层只修改空格也会改变哈希,怎样兼顾可用性?
父问严格绑定快照后,规范化解决非语义差异但引入边界。
先定义业务级规范化,例如无意义空白、JSON 键序;审批展示与实际执行都使用同一规范化结果。格式可能影响邮件排版、代码或签名时不能随意规范化。记录原审阅版本,验证语义参数完全相同;没有明确规则就重新批准。
沿着这个回答继续深入
第 3 层正文没变,收件人增加一位,为什么仍需新批准?
文本规范化不能掩盖动作其他参数变化,检验快照是否完整。
动作语义包含目标、权限、费用与内容,不能只哈希正文。新增收件人扩大信息披露范围,原批准未必覆盖。重新生成完整 action_hash 并展示差异,确认后才执行;旧批准不会因正文相同自动迁移到新动作。
第 1 层审批者离职后旧批准有效吗?
长时间等待后,身份合法性与批准生命周期发生变化。
按业务策略重新验证当前权限。教学中的严格执行策略会拒绝已失权主体的旧批准,并让新的有权审批者确认。若业务定义批准是当时授予且持续有效的凭据,也必须明确期限、撤销和范围;不能仅凭旧 actor_id 默认有效。
第 1 层暂停节点恢复前代码会不会重跑?
批准恢复不仅是状态变更,还涉及框架执行语义。
会,LangGraph 的动态 interrupt 恢复会重入节点开头,暂停前代码再次执行;子图还可能让父节点重入。将计算与副作用分离,副作用按稳定操作键可重试;升级后中断次序也需验证,不能把恢复值错误匹配到另一个审批项。
先找出改变的条件,再判断原方案中哪些前提仍成立。下面的案例是教学推演,便于将原理迁移到新问题。
改变的条件:对象相同但商业条件变化
延伸问题:原批准酒店 500 元,三天后 650 元可继续吗?
动作金额和条款已经超出快照,重新审批或按用户预先明确的上限规则判断。批准状态为 approved 不能覆盖价格变化;重新查询报价并保存版本,再让用户审阅。若已有外部订单先对账,避免报价变化引发重复预订。
保持不变的原理:批准绑定具体条件,任务等待不会冻结外部世界。
改变的条件:原审批者不在线,另一人代点同意
延伸问题:持有审批链接是否足够?
链接定位待审项,身份和代理资格需服务端确认。记录实际 actor、代理关系与权限范围,核对同一动作快照;重复回调仍归同一批准。不可将共享链接当成无限 bearer 授权,尤其会产生外部效果时。
保持不变的原理:可访问审批入口不等于具备批准能力,可信身份与动作范围缺一不可。
依据公开技术资料设计;参考资料支持技术机制,场景与评分标准为本站设计,不代表某公司面试原题。 新增问答与迁移案例用于原理讲解,来源核查与案例运行验证分别记录。
读完后可以对照这些标准解释原理、边界和取舍。掌握程度由你自评;需要进一步验证时,再完成下方小任务。
从两份数据库的幂等反例,继续验证租约、检查点和独立服务方回执。解压可靠性实验 v3,在独立目录执行。
python3 cli.py submit --db crash.sqlite
python3 cli.py run --db crash.sqlite --lease-seconds 2 --fault after_collect
python3 cli.py inspect --db crash.sqlite
# 首次运行预期退出码 75;等待至少 2 秒后分别执行
python3 cli.py run --db crash.sqlite
python3 evaluate.py --db crash.sqlite固定 collect → draft → verify → publish 流程;验证本地持久协议与真实进程退出,不证明任意远程服务恰好一次执行。
给批准接口写条件更新伪代码,模拟两次同时到达的同意请求。