负载均衡经常被当作”把请求分出去”的基础设施,但选错策略的后果是:所有服务器都健康,用户体验却不一致。
核心判断
负载均衡策略的选择取决于两个变量:后端是否同构,以及请求特征是否可预测。这两个维度决定了你需要静态权重、动态连接感知、客户端亲和性,还是实时性能自适应。
四种服务器级策略
WRR:同构世界的默认答案
Weighted Round Robin 在负载均匀、后端同构时几乎永远是对的。它的优势不是最优,而是可预测——300 个请求打到 3 台服务器,每台约 100 个。这种确定性让容量规划和故障排查变得简单。
加权的唯一场景是异构硬件(一台大机器配 weight=4,小机器配 weight=1)。但权重是静态配置,一旦后端性能动态变化,WRR 就开始失效。
适用:内部工具、稳定生产服务、同构基础设施。
P2C:连接生命周期的解药
Power of Two Choices 的算法简单得令人惊讶:随机选两台,比较活跃连接数,路由到较少的那台。但它解决了一个真实痛点:连接生命周期高度可变的场景。
实时协作平台(Figma、Google Docs)是典型例子:WebSocket 长连接保持 30-60 分钟,API 调用 50-200ms,文件上传 30-90 秒。WRR 会让某台服务器堆积大量长连接,P2C 则通过活跃连接数让负载自然平衡。
局限:P2C 只看连接数,不看处理时间。一台处理 10 个轻量请求的服务器,和一台处理 10 个重请求的服务器,在 P2C 眼里是一样的。
适用:实时应用、自动伸缩环境、WebSocket/长轮询混合负载。
HRW:缓存亲和性的精确表达
Highest Random Weight(Rendezvous hashing)用一致哈希把同一客户端确定性映射到同一后端。当后端有本地缓存时,这能显著提高缓存命中率。
关键特性是最小重新映射:服务器增减时,只有约 1/N 的客户端需要重新映射,而简单取模哈希会导致 100%。
风险:如果某个客户端 disproportionately 多产流量,对应后端会成为热点。HRW 优先保证一致性,而非完美的负载分布。
适用:个性化推荐、CDN、有状态后端、会话密集应用。
Least-Time:异构基础设施的自适应路由
Least-Time 同时追踪响应时间(TTFB)和活跃连接数,计算每台服务器的 score,路由到最低分的服务器。它是唯一对动态性能差异做出实时反应的策略。
混合实例类型的场景几乎是它的主场:高性能专用服务器 5ms、标准云实例 15ms、可突发实例 10-50ms。WRR 让用户随机体验不同延迟;Least-Time 自动把更多流量发给快的实例,当慢实例恢复时流量自然回流。
结合权重还可以表达容量差异:weight=3 表示这台服务器在 score 变劣前可以承受 3 倍流量。
适用:异构后端、延迟敏感服务、性能会动态变化的云环境。
服务级策略:发布与韧性
服务器级策略解决”哪个实例处理请求”,服务级策略解决”哪个版本/集群接收流量”:
- Weighted(服务级 WRR):金丝雀发布(95% v1 + 5% v2)、蓝绿部署、A/B 测试
- Mirroring:复制流量到影子集群做 shadow testing,零用户影响
- Failover:主集群故障时自动切到备份集群
最复杂的组合:服务级 WRR 做金丝雀(90% v1 + 10% v2),每个版本内部再用 Least-Time 做性能自适应路由。
跨代理实现对比
| 特性 | Traefik | Envoy |
|---|---|---|
| WRR | ✅ 默认 | ✅ |
| P2C | ✅ | ✅ |
| HRW | ✅ | ✅(一致性哈希) |
| Least-Time | ✅ | ✅(多种 lb 算法) |
| 自动重试 | 需配置 | ✅ 内置 |
| 熔断 | 需配置 | ✅ 内置 |
| 全局速率限制 | 需配置 | ✅ 通过外部 RLS |
| 请求镜像 | ✅ | ✅ |
| 异常检测 | 基础健康检查 | ✅ 被动异常检测 |
Traefik 的优势在于与 Kubernetes 生态的紧密集成的声明式配置;Envoy 的优势在于作为服务网格 sidecar 时提供的统一治理能力。
决策树
后端是否同构?
├─ 是 → 请求是否可预测?
│ ├─ 是 → WRR
│ └─ 否 → P2C
└─ 否 → 是否有缓存/状态需求?
├─ 是 → HRW
└─ 否 → 性能是否动态变化?
├─ 是 → Least-Time
└─ 否 → WRR + weights
实践原则
- 从 WRR 开始,按需演进。不要为还没出现的异构需求提前引入复杂度。现代代理(Traefik、Envoy)都支持在线切换策略,没有停机时间。
- 连接生命周期是常被忽视的选型因素。混合短 API 调用和长 WebSocket 连接时,P2C 或 Least-Time 几乎是必须的。
- 缓存命中率优化往往比完美负载分布更重要——HRW 的不均匀性是有意为之,为了换取局部性收益。
来源:choosing-load-balancing-strategy · advanced-load-balancing-traefik · what-is-envoy
相关页面:progressive-delivery · service-mesh · traefik · envoy