60 秒回答模板

Agent 异步任务经消息队列处理时,结果关联不能靠消费者记忆,也不能只靠数据库轮询。标准做法是入口生成全局 requestId/taskId,消息、状态表、trace 和回调都携带这个标识,用队列解耦执行压力,用数据库保存可查询状态。 入口生成关联键:用户请求进入后创建 taskId、sessionId、userId、幂等键和 traceId。后续每条 MQ 消息、工具调用、状态更新和结果回调都携带这些字段。 状态表记录进度:数据库适合保存任务状态、阶段、版本、结果摘要、失败原因和更新时间。前端可以查状态或订阅推送,但执行本身不应靠数据库锁和轮询驱动。 队列负责削峰解耦:MQ 负责异步投递、重试、缓冲和消费者扩缩容。它能把模型调用、工具执行、结果聚合拆开,避免用户请求线程长时间阻塞。 结果回传要幂等:消费者写结果时按 taskId 和阶段做幂等校验,避免重复消费导致重复写入、重复通知或重复执行有副作用的工具。 异常路径要闭环:需要处理超时、死信、取消、重试耗尽、消费者崩溃和结果迟到。状态机必须定义 running、succeeded、failed、cancelled、expired 等终态。 最后要把方案落到可验证的指标、失败兜底和迭代闭环上。面试里不要只讲概念名词,要说明边界、取舍、数据来源、线上观测和出问题后的回滚或人工介入。

考点 Correlation ID
难度 真实面经题
回答目标 让面试官看到你能把 Agent 异步执行讲成可靠的分布式任务系统。

深入解析

01

入口生成关联键

用户请求进入后创建 taskId、sessionId、userId、幂等键和 traceId。后续每条 MQ 消息、工具调用、状态更新和结果回调都携带这些字段。

02

状态表记录进度

数据库适合保存任务状态、阶段、版本、结果摘要、失败原因和更新时间。前端可以查状态或订阅推送,但执行本身不应靠数据库锁和轮询驱动。

03

队列负责削峰解耦

MQ 负责异步投递、重试、缓冲和消费者扩缩容。它能把模型调用、工具执行、结果聚合拆开,避免用户请求线程长时间阻塞。

04

结果回传要幂等

消费者写结果时按 taskId 和阶段做幂等校验,避免重复消费导致重复写入、重复通知或重复执行有副作用的工具。

05

异常路径要闭环

需要处理超时、死信、取消、重试耗尽、消费者崩溃和结果迟到。状态机必须定义 running、succeeded、failed、cancelled、expired 等终态。

易错点

  • 只说加 MQ,不说明任务 ID 和结果如何关联。
  • 把数据库当消息系统频繁轮询,导致延迟和压力增加。
  • 没有幂等设计,重复消费造成重复通知或重复执行。
  • 超时和取消状态不清晰,迟到结果覆盖终态。
  • 缺少 trace,无法排查 Agent 卡在哪个阶段。

面试官追问

为什么不直接通过数据库通信?

数据库轮询会增加读写压力、延迟和锁竞争,也缺少天然的削峰、重试和消费者调度能力。数据库更适合存状态和结果。

前端如何拿到异步结果?

可以轮询任务状态、使用 SSE/WebSocket 推送阶段事件,或在完成后通过回调通知。无论哪种方式都用 taskId 关联。

重复消费怎么处理?

消费者要按幂等键检查阶段是否已完成,写状态使用条件更新,有副作用的外部调用要有业务幂等或补偿机制。

结果比超时响应晚到怎么办?

状态机要允许 expired 后的迟到结果进入审计或缓存,但不能再无条件覆盖用户已看到的终态,必要时发补偿通知。