真实面经题目 · 原创解析
Agent 异步任务通过消息队列处理时,如何将处理结果与原请求关联,为什么不直接用数据库通信?
这题考 Agent 异步任务的工程链路。回答要讲 correlation id、状态表、幂等、回调、超时和消息队列与数据库的职责边界。
真实面经题目 · 原创解析
这题考 Agent 异步任务的工程链路。回答要讲 correlation id、状态表、幂等、回调、超时和消息队列与数据库的职责边界。
Agent 异步任务经消息队列处理时,结果关联不能靠消费者记忆,也不能只靠数据库轮询。标准做法是入口生成全局 requestId/taskId,消息、状态表、trace 和回调都携带这个标识,用队列解耦执行压力,用数据库保存可查询状态。 入口生成关联键:用户请求进入后创建 taskId、sessionId、userId、幂等键和 traceId。后续每条 MQ 消息、工具调用、状态更新和结果回调都携带这些字段。 状态表记录进度:数据库适合保存任务状态、阶段、版本、结果摘要、失败原因和更新时间。前端可以查状态或订阅推送,但执行本身不应靠数据库锁和轮询驱动。 队列负责削峰解耦:MQ 负责异步投递、重试、缓冲和消费者扩缩容。它能把模型调用、工具执行、结果聚合拆开,避免用户请求线程长时间阻塞。 结果回传要幂等:消费者写结果时按 taskId 和阶段做幂等校验,避免重复消费导致重复写入、重复通知或重复执行有副作用的工具。 异常路径要闭环:需要处理超时、死信、取消、重试耗尽、消费者崩溃和结果迟到。状态机必须定义 running、succeeded、failed、cancelled、expired 等终态。 最后要把方案落到可验证的指标、失败兜底和迭代闭环上。面试里不要只讲概念名词,要说明边界、取舍、数据来源、线上观测和出问题后的回滚或人工介入。
用户请求进入后创建 taskId、sessionId、userId、幂等键和 traceId。后续每条 MQ 消息、工具调用、状态更新和结果回调都携带这些字段。
数据库适合保存任务状态、阶段、版本、结果摘要、失败原因和更新时间。前端可以查状态或订阅推送,但执行本身不应靠数据库锁和轮询驱动。
MQ 负责异步投递、重试、缓冲和消费者扩缩容。它能把模型调用、工具执行、结果聚合拆开,避免用户请求线程长时间阻塞。
消费者写结果时按 taskId 和阶段做幂等校验,避免重复消费导致重复写入、重复通知或重复执行有副作用的工具。
需要处理超时、死信、取消、重试耗尽、消费者崩溃和结果迟到。状态机必须定义 running、succeeded、failed、cancelled、expired 等终态。
数据库轮询会增加读写压力、延迟和锁竞争,也缺少天然的削峰、重试和消费者调度能力。数据库更适合存状态和结果。
可以轮询任务状态、使用 SSE/WebSocket 推送阶段事件,或在完成后通过回调通知。无论哪种方式都用 taskId 关联。
消费者要按幂等键检查阶段是否已完成,写状态使用条件更新,有副作用的外部调用要有业务幂等或补偿机制。
状态机要允许 expired 后的迟到结果进入审计或缓存,但不能再无条件覆盖用户已看到的终态,必要时发补偿通知。