Agent 网关的高可用架构如何设计
1️⃣ 考察意图
面试官想看你能否设计 Agent 网关的高可用方案,确保网关不成为单点故障。刁钻点在于:高可用不只是"多实例部署",还需要考虑状态同步、故障检测、快速降级等。答好了能展示你在系统可靠性设计方面的深度经验。
2️⃣ 标准答
Agent 网关高可用从"无状态设计、多活部署、快速失败、降级预案"四个维度设计:
1. 无状态设计(Stateless Design)
- 网关不保存会话状态——任意实例可处理任意请求。状态全部外部化:认证状态 → JWT(客户端携带,网关只验证)
- 限流计数 → Redis(所有实例共享)
- 缓存数据 → Redis(所有实例共享)
- 路由表 → etcd/Consul(注册中心推送) 价值:实例可随时增减,不影响正在处理的请求。负载均衡器自动剔除故障实例挑战:WebSocket 长连接有状态——连接绑定到特定实例。解法:用 sticky session 或 WebSocket 网关层独立部署
2. 多活部署(Multi-Active Deployment)
- 跨可用区(AZ)部署:网关实例分布在 2-3 个 AZ。一个 AZ 故障时其他 AZ 继续服务
- 负载均衡:用云厂商 LB(如 AWS ALB)或自建 LB(如 HAProxy)。LB 健康检查每 5s 探测网关实例,故障实例 10s 内自动摘除
- 容量规划:每个 AZ 部署 N 个实例,单 AZ 容量 = 总容量的 50%。一个 AZ 故障时剩余 AZ 可承载全部流量(需要 2x 冗余)
- Graceful Shutdown:实例下线前先停止接收新请求,等待已处理请求完成(最多 30s),然后退出。避免请求中断
3. 快速失败(Fast Failure)
- 后端工具超时时快速返回错误,不让请求堆积:工具调用超时:默认 30s,超时后返回
504 Gateway Timeout+Retry-After建议 - 连接建立超时:5s,超时后熔断该后端
- 请求队列超时:排队 >5s 的请求直接返回
429,不让用户空等 超时分级:不同工具有不同超时——实时工具(search)5s,计算工具(execute_code)60s,长任务(analyze_report)300s级联超时防护:总超时 = Agent 超时(60s)> 网关超时(30s)> 工具超时(5-300s)。确保网关在 Agent 超时前返回
4. 降级预案(Degradation Plan)
- 网关自身故障时的降级:DNS 切换:网关集群全部不可用时,DNS 切换到备用集群(灾备 DC)。恢复时间约 1-5 分钟(DNS TTL)
- 直连模式:网关故障时 Agent 直连工具后端(预配置的 IP 地址)。跳过网关的安全和协议转换,但保证基本功能可用
- 缓存模式:网关故障时 Agent 使用本地缓存的结果(即使过期)。降级为"只读模式",不调用任何工具 后端工具故障时的降级:
- 备用工具:主工具故障时切换到备用工具(如 Google Search → Bing Search)
- 缓存降级:工具故障时返回缓存数据+标注"数据可能不是最新的"
- 模型知识降级:所有工具不可用时,Agent 用 LLM 自身知识回答+标注"无法访问外部数据"
5. 可观测性驱动的自愈
- 健康检查:网关每 10s 检查后端工具健康状态,不健康的工具自动从路由表移除
- 自动扩容:QPS >阈值时自动扩容网关实例(HPA)。CPU >70% 或 P99 >2s 触发扩容
- 自动回滚:新版本部署后错误率 >2% 时自动回滚到上一版本(Argo Rollouts)
3️⃣ 答题模板(30 秒电梯版)
"网关高可用四维:无状态设计——状态全外部化(JWT认证/Redis限流缓存/etcd路由表),任意实例处理任意请求。多活部署——跨2-3个AZ+LB健康检查+2x冗余+Graceful Shutdown。快速失败——工具超时30s+连接超时5s+队列超时5s,超时分级(search 5s/execute 60s/analyze 300s)。降级预案——网关故障时DNS切换/直连模式/缓存模式,工具故障时备用工具/缓存降级/模型知识降级。自愈——健康检查移除不健康工具+HPA自动扩容+错误率>2%自动回滚。"
4️⃣ 高频追问 & 应对
追问 1:WebSocket 长连接怎么做高可用?连接断了怎么办?
方案:(1) Sticky Session——LB 将同一
session_id的请求路由到同一网关实例,WebSocket 连接绑定到该实例。实例故障时连接断开,客户端自动重连到新实例;(2) 连接迁移——网关实例下线前发送GOAWAY帧,客户端收到后重连到新实例。需要客户端支持重连逻辑;(3) WebSocket 网关独立——将 WebSocket 长连接管理独立为专用服务(如用 Centrifugo/Gorilla),与主网关解耦。主网关无状态可自由扩缩容,WebSocket 服务有状态但可独立管理
追问 2:Redis 挂了限流怎么办?不限流会让后端被打挂。
Redis 故障时的降级:(1) 本地限流——每个网关实例用内存令牌桶做本地限流(不精确但比不限流好)。限流配额 = 全局配额 / 实例数。例如全局 1000 QPS / 10 实例 = 每实例 100 QPS;(2) 保守模式——Redis 故障时限流配额降为正常的 50%,给恢复留余量;(3) 快速恢复——Redis 用集群模式(3 主 3 从),单节点故障不影响整体。主从切换 <10s。建议:Redis 集群+本地兜底+保守模式三层防护
追问 3:直连模式(跳过网关)不会绕过安全控制吗?
会的,这是"可用性 vs 安全性"的权衡。控制方案:(1) 限时启用——直连模式最多启用 5 分钟,网关恢复后自动切回;(2) 白名单工具——直连模式只允许调用预白名单的低风险工具(如
search、get_document),高风险工具(如send_email、transfer_money)在网关恢复前不可用;(3) 事后审计——直连模式期间的所有调用记录在 Agent 本地日志,网关恢复后上传审计。核心原则:直连模式是"紧急止血"而非"正常运行",安全降级必须有时间限制和事后审计
5️⃣ 避坑 · 常见错误答法
- ❌ "网关挂了系统就挂了" → ✅ "高可用设计确保网关不成为单点——多活部署+快速失败+降级预案。网关全部故障时降级为直连模式或缓存模式,保证基本功能可用。"
- ❌ "超时设长一点就能避免超时错误" → ✅ "超时太长会导致请求堆积——1000 个请求 × 60s 超时 = 60000 个并发连接,可能打满网关资源。需要合理超时+快速失败+降级,而非无限等待。"
- ❌ "高可用就是多部署几个实例" → ✅ "多实例只是基础。还需要:无状态设计(实例可互换)、多 AZ(防机房故障)、快速失败(防请求堆积)、降级预案(网关全挂时的兜底)、自愈(自动扩容回滚)。"
6️⃣ 简历呼应
- 如果你有高可用项目:从"Agent 网关高可用架构"切入,描述你设计的四层高可用方案和 SLA 数据(如 99.99% 可用率、RTO <1min)
- 如果你只做过 SRE:用"SRE 实践"迁移——健康检查/熔断/降级/自动扩容等直接适用,额外需要的是"Agent 特有的降级模式"(缓存模式/模型知识降级)
- 如果你是校招无项目:设计一个 Agent 网关高可用方案,包含多活部署+快速失败+降级预案,模拟故障场景测试恢复时间
- "Designing for High Availability" (Google SRE, 2023)
- "Circuit Breaker Pattern" (Microsoft, 2023)
- "Graceful Degradation in Distributed Systems" (Netflix, 2023)
本章学习完毕 ← 返回 Agent 岗面试宝典 v3 · 精华版 | 📝 建议整理错题笔记 | 🎯 标记掌握程度