路由策略
路由策略决定了 Snail AI Server 如何将智能体的推理请求分发到应用下的各个客户端节点。选择合适的路由策略对于保证系统的性能、稳定性和资源利用率至关重要。
策略概览
Snail AI 提供 6 种内置路由策略:
| 策略 | 标识 | 中文名称 | 核心思想 |
|---|---|---|---|
| Least Load | LEAST_LOAD | 最少负载 | 选择当前负载最轻的节点 |
| Round Robin | ROUND_ROBIN | 轮询 | 按顺序依次分发到各节点 |
| Consistent Hash | CONSISTENT_HASH | 一致性哈希 | 相同会话路由到同一节点 |
| Random | RANDOM | 随机 | 随机选择一个在线节点 |
| LRU | LRU | 最近最少使用 | 选择最近最少被分配请求的节点 |
| First | FIRST | 固定首节点 | 始终选择第一个可用节点 |
策略详解
1. 最少负载(Least Load)
标识:LEAST_LOAD
工作原理:Server 实时跟踪每个节点的当前活跃对话数(activeChats)和最大并发容量(maxConcurrent),计算各节点的负载率,并将新请求分发到负载率最低的节点。
负载率 = activeChats / maxConcurrent
选择 → 负载率最低的在线节点适用场景:
- 各节点的硬件配置不同(异构集群),
maxConcurrent值不同。 - 希望充分利用所有节点的计算能力。
- 对话处理时间差异较大的场景。
优势:
- 自动适应节点能力差异,配置高的节点自然承担更多请求。
- 能够动态应对负载波动,避免单节点过载。
注意事项:
- 依赖节点心跳中上报的实时负载数据,心跳延迟可能导致短暂的负载不均。
推荐
最少负载是默认且推荐的路由策略,适用于大多数生产场景。
2. 轮询(Round Robin)
标识:ROUND_ROBIN
工作原理:维护一个全局计数器,按顺序将请求依次分发到各在线节点。第 1 个请求发到节点 A,第 2 个发到节点 B,第 3 个发到节点 C,然后循环回到节点 A。
请求 1 → Node A
请求 2 → Node B
请求 3 → Node C
请求 4 → Node A(循环)
...适用场景:
- 各节点硬件配置相同(同构集群)。
- 每个对话的处理时间大致相同。
- 希望请求分配绝对均匀。
优势:
- 实现简单,分配绝对均匀。
- 不依赖节点的实时状态信息。
注意事项:
- 不考虑各节点的实际负载情况。如果某些对话处理时间较长,可能导致部分节点积压。
- 不适合异构集群(节点能力不同)场景。
3. 一致性哈希(Consistent Hash)
标识:CONSISTENT_HASH
工作原理:将请求的会话标识(如 conversationId 或用户 ID)通过哈希函数映射到哈希环上,确保相同标识的请求始终路由到同一个节点。当节点增加或减少时,只有少量请求需要重新映射。
Hash(conversationId) → 哈希环位置 → 对应节点
相同的 conversationId 始终映射到同一节点适用场景:
- 需要会话亲和性(Session Affinity),确保同一对话的所有请求由同一节点处理。
- 客户端节点维护了本地状态(如本地缓存、模型热数据)。
- 减少跨节点状态同步的开销。
优势:
- 天然支持会话亲和性,避免上下文在节点间切换。
- 节点扩缩容时影响范围小(只有少量会话需要迁移)。
注意事项:
- 如果某些会话特别活跃,可能导致对应节点过载。
- 节点故障时,该节点上的会话会被重新分配到其他节点。
4. 随机(Random)
标识:RANDOM
工作原理:从所有在线节点中随机选择一个节点处理请求。每次分配完全独立,不考虑历史分配情况。
可用节点 = [Node A, Node B, Node C]
选择 → 随机一个适用场景:
- 简单测试和开发环境。
- 节点数量较多且配置相同的场景。
- 对分配均匀性要求不高的场景。
优势:
- 实现最简单,无状态。
- 在大样本下趋近均匀分配。
注意事项:
- 短期内可能出现分配不均(随机性导致)。
- 不考虑节点实际负载。
5. 最近最少使用(LRU)
标识:LRU
工作原理:维护一个按"最近被分配请求的时间"排序的节点列表,优先选择最长时间未被使用的节点。每次分配后,被选中的节点移到列表尾部。
最近分配时间排序(从旧到新):
Node C (10:01) → Node A (10:03) → Node B (10:05)
新请求 → 选择 Node C(最久未使用)
更新后:
Node A (10:03) → Node B (10:05) → Node C (10:06)适用场景:
- 希望各节点的使用频率尽量均匀。
- 对话处理时间差异大,轮询可能导致部分节点积压。
- 需要给各节点留出"冷却时间"的场景。
优势:
- 自然地实现了时间维度的均匀分配。
- 避免了某个节点被连续多次选中的情况。
注意事项:
- 与轮询类似,不考虑节点的实际并发容量差异。
6. 固定首节点(First)
标识:FIRST
工作原理:始终选择第一个可用的在线节点处理所有请求。只有当第一个节点不可用时,才会切换到下一个节点。
可用节点 = [Node A, Node B, Node C]
所有请求 → Node A
Node A 离线 → 切换到 Node B
Node A 恢复 → 切回 Node A适用场景:
- 主备部署模式(Active-Standby),通常只使用主节点,备用节点仅在主节点故障时接管。
- 单节点运行场景,只有一个 Agent Client 实例。
- 开发和测试环境。
优势:
- 行为最简单和可预测。
- 适合主备容灾场景。
注意事项:
- 所有流量集中在一个节点上,不具备负载均衡能力。
- 备用节点在正常情况下完全空闲,资源利用率低。
策略选择指南
根据你的部署场景和业务需求,参考以下决策表选择合适的路由策略:
| 场景 | 推荐策略 | 原因 |
|---|---|---|
| 生产环境 - 通用场景 | 最少负载 | 自动适应负载变化,充分利用资源 |
| 生产环境 - 同构集群 | 最少负载 或 轮询 | 节点能力相同时,两者效果接近 |
| 生产环境 - 异构集群 | 最少负载 | 能自动适应不同节点的处理能力差异 |
| 需要会话亲和性 | 一致性哈希 | 确保同一会话由同一节点处理 |
| 主备容灾部署 | 固定首节点 | 主节点处理所有请求,备节点待命 |
| 单节点 / 开发测试 | 固定首节点 或 随机 | 只有一个节点时策略无差别 |
| 节点有本地状态 | 一致性哈希 | 减少状态迁移开销 |
配置路由策略
创建应用时设置
在创建应用时,路由策略是必填字段,默认值为"最少负载"(LEAST_LOAD)。
修改已有应用的策略
- 在应用管理列表中,点击目标应用的「编辑」按钮。
- 在路由策略下拉选择器中选择新的策略。
- 点击「确定」保存。
TIP
修改路由策略会立即生效,之后的新请求将按照新策略进行分发。已经在处理中的请求不受影响。
智能体绑定应用
将智能体绑定到应用后,该智能体的推理请求将通过应用的路由策略分发到客户端节点执行。
绑定步骤
- 进入智能体的配置页面。
- 在「执行应用」下拉选择器中选择目标应用。
- 保存智能体配置。
解绑
将「执行应用」设为空值即可解绑。解绑后,智能体的推理将回退到 Server 本地执行。
监控与调优
观察指标
配置路由策略后,建议关注以下指标来评估策略效果:
| 指标 | 获取方式 | 关注点 |
|---|---|---|
| 各节点活跃对话数 | 节点列表的负载进度条 | 分布是否均匀 |
| 各节点在线状态 | 节点列表的状态指示灯 | 是否有频繁离线 |
| 对话响应时间 | 可观测性追踪 | 是否有节点响应明显偏慢 |
调优建议
- 如果发现负载分布不均匀,考虑从轮询/随机切换到最少负载。
- 如果对话处理中频繁出现上下文丢失,考虑切换到一致性哈希以实现会话亲和。
- 如果只有少量节点(1-2个),策略差异不大,使用默认的最少负载即可。