先这样答
我会同时处理幂等和审批。幂等要求每次副作用操作都带唯一业务键。这个键由任务 ID 加步骤 ID 组成。服务端收到请求后,先按业务键识别是否已经执行过。第一次请求执行操作并记录结果。后续重复请求直接返回第一次的结果。这样即使 Agent 因为超时重试,也不会产生二次扣款。发消息等副作用操作也遵循同一规则。
人工审批要按副作用的可逆程度分级。可逆操作可以自动执行,但执行后要保留审计记录。不可逆操作,例如转账和对外合同,不能直接执行。Agent 应该把操作送进审批队列,并挂起等待审批结果。审批通过后,服务端再执行副作用操作。审批不通过则不执行。超过审批时限仍没有结果时,默认拒绝,不能默认执行。这样可以把重复请求和未经确认的不可逆操作分开控制。
面试官会怎么追问
-
「如果客户端没有收到结果,重试会不会导致重复扣款?」
不会,只要重试请求继续携带同一个任务 ID 加步骤 ID。服务端按唯一业务键识别出重复请求,并返回首次执行结果,不再执行第二次扣款。 -
「所有副作用操作都必须人工审批吗?」
不需要,先按副作用是否可逆分级。可逆操作可以自动执行,但要做事后审计;不可逆的转账和对外合同进入审批队列,通过后才执行。 -
「审批一直没有结果,Agent 应该怎么处理?」
Agent 在审批期间挂起等待,不继续执行该副作用操作。超过审批时限后默认拒绝,不能把超时当成批准,也不能默认执行。
回答的坑
- 只使用任务 ID 而不加步骤 ID,无法准确区分同一任务中的不同副作用操作。
- 把审批超时当成默认同意,会让不可逆操作在没有人工确认时直接执行。
同系列的题
—— 本题完 ——