术语含义
请求路径中的每一次检查都可能无法给出结果: 依赖超时、信号缺失、密钥无法获取。开放失败表示请求会像这次检查不存在一样继续执行。关闭失败表示请求会走更严格的路径: 被拒绝、被挑战,或者转到现有的更强控制。
通常没有绝对正确的选择。合适的做法取决于路由实际承担的功能,以及错误决策的代价。
为什么这对 actor 检查很重要
actor 检查会为请求增加上下文: 这次交互看起来像 Human、Human + AI、Agent 还是 Unknown。当这些上下文不可用时,应用仍然必须做出响应。常见有两种失败模式:
- 意外的关闭失败。 超时或信号缺失被当作可疑情况,真实用户在故障期间被阻止。
- 敏感操作上的意外开放失败。 缺失的结果被静默当作 Human,影响较大的操作以低于预期的审查程度继续执行。
这两种情况都来自把选择留给默认行为。修复方式是按路由显式决定。我们关于为人和 AI agent 设计应用级策略的文章说明了失败行为如何纳入按路由的策略中。
如何选择
一种实用方法是把路由按风险等级分组:
- 低影响(公开页面、文档、只读目录路由): 开放失败。缺失 actor 结果不应改变任何行为。
- 中等影响(注册、表单提交、带成本的搜索): 通常采用开放失败并记录日志,或者应用轻微调整,例如标准速率限制。
- 高影响(账户变更、数据导出、不可逆操作): 关闭失败到你现有的更强控制,例如重新认证或确认。重点不是阻止,而是回退到你本来就会使用的检查。
然后为相关情况定义同样的行为:
- 超时: 检查未能在规定时间内给出响应。
- 遥测缺失: 集成未运行,或者某个信号缺失。
- Unknown: 检查已运行,但证据不足以支持判断。
- 过期证据: 结果来自更早的时间,不应在更敏感的操作中复用。
常见误解
- "关闭失败更安全。" 它把成本转嫁给合法用户。对于低影响路由,在故障期间采用关闭失败造成的伤害可能比它防止的风险更大。
- "Unknown 就是失败。" Unknown 是有效结果。它需要单独、明确地处理,这种处理方式可能与超时处理一致,也可能不一致。
- "没有结果就表示 Human。" 绝不要根据证据缺失去推断 actor class。
Proof of Actor 如何处理
Proof of Actor 不会因为超时或 Unknown 结果就把对象判定为 Human,安装它也不会阻止任何事情: 团队从观察模式开始。每条路由和风险等级使用开放失败还是关闭失败,由应用所有者决定,并通过 Route 在你自己的代码中执行。这让强制执行保持可预测,也让你能在任何策略正式生效前检查结果。
阅读路由决策如何纳入其中,或申请提前访问。