# 《WaLiAPI - 本地 LLM API 网关》第1-5节:负载均衡调度器
作者:小傅哥
博客:https://bugstack.cn (opens new window)
沉淀、分享、成长,让自己和他人都能有所收获!😄
大家好,我是技术UP主小傅哥。
前面几节我们有了数据库和渠道适配器。现在问题来了:当用户配置了多个渠道都能服务同一个模型时,请求应该发给谁? 这就是调度器(Dispatcher)要解决的问题——负载均衡 + 故障转移。
# 一、本章诉求
- 理解负载均衡的常见策略及其适用场景
- 实现"模型匹配过滤 → 优先级分组 → 组内权重随机"的调度算法
- 构建有序的故障转移队列(failover queue)
- 实现 Channel → ChannelConfig 的转换方法
# 二、负载均衡策略选型
# 2.1 常见策略对比
| 策略 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 轮询(Round Robin) | 依次轮流 | 绝对均匀 | 无法区分渠道能力差异 | 同构后端 |
| 随机 | 纯随机选择 | 简单 | 分布不可控 | 简单场景 |
| 权重随机 | 按权重概率选择 | 流量按比例分配 | 实现稍复杂 | 异构后端 |
| 最少连接 | 选当前连接最少的 | 动态均衡 | 需要维护状态 | 长连接 |
| 优先级故障转移 | 只用最高优先级,失败降级 | 主备清晰 | 低优先级闲置 | 主备架构 |
# 2.2 WaLiAPI 的选择
WaLiAPI 的使用场景有这样的特点:
- 主备需求:用户可能想"优先用 DeepSeek(便宜),DeepSeek 挂了自动切 OpenAI(兜底)"→ 需要优先级
- 分摊需求:用户可能有 3 个 OpenAI Key(不同账号),想按 5:3:2 分摊请求 → 需要权重
- 无状态:桌面应用不维护长连接计数,调度应该是无状态的纯函数 → 权重随机而非轮询
所以我们采用 "优先级分组 + 组内权重随机" 的混合策略:
请求 gpt-4o
│
↓ 过滤:状态启用 且 支持该模型
┌─────────────────────────────┐
│ 优先级 10: [OpenAI-A(w:5), OpenAI-B(w:3)] ← 先尝试这组,组内 5:3 概率
│ 优先级 5: [DeepSeek(w:1)] ← 上面全失败后尝试
│ 优先级 1: [Ollama(w:1)] ← 最后兜底
└─────────────────────────────┘
│
↓ 输出有序队列
[OpenAI-A/B(随机序), OpenAI-B/A, DeepSeek, Ollama]
│
↓ Proxy 层按顺序尝试,直到成功或耗尽
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13

