三台后端服务器,请求怎么分才公平?最省事的答案是 round-robin,中文叫轮询:第一个请求给 A,第二个给 B,第三个给 C,第四个又回到 A,循环往复,谁也不多拿。

常见出现的位置

  • 负载均衡器:Nginx 的 upstream 默认策略就是轮询,不配权重时请求挨个分发。
  • DNS 轮询:一个域名解析出多条记录,DNS 服务器轮流返回,实现最原始的流量分摊。
  • 操作系统调度:时间片轮转调度给每个进程分配固定时间片,用完就排到队尾等下一轮。Linux 的 CFS 调度器虽不是严格轮询,公平思想却一脉相承。
  • 令牌环网络:早期局域网里令牌沿环依次传递,算轮询思想的老前辈。

DNS 轮询为什么不算高可用

域名轮询看着省事,毛病不少:客户端会缓存解析结果,一台机器挂了,缓存没过期前用户照样撞上去;权重做不了细粒度;健康检查基本没有。所以正经架构里 DNS 轮询只当粗分流的补充,精细调度交给负载均衡器或网关。有些场景用权威 DNS 的健康检查功能兜底,节点挂了自动摘除,比裸轮询强一档。

好处和短板都很直白

好处是实现零成本、天然公平,不需要统计任何状态,排障时请求轨迹一眼就能推出来,日志对得上号。短板同样明显:它假设每台机器能力一样、每个请求开销一样。现实里一台机器卡了,轮询照样把请求派过去压垮它;一个请求要算十秒,另一个一毫秒,负载立刻失衡。还有个隐性坑是会话粘性:用户上一秒连在 A,下一秒被分到 B,登录态就丢了,要保会话得加粘性策略或把会话放共享存储。工程上更常见的是加权轮询,给性能强的机器多派请求,Nginx 里加个 weight 数字就能配。

什么时候够用

节点性能接近、请求开销均匀的场景,round-robin 就是默认正确答案,简单可靠还不用维护状态。机器规格参差不齐、有长连接或长任务时,先考虑加权轮询或最小连接数策略,流量再大就上消息队列削峰。压测时把策略固定成单一变量,才能看清真实瓶颈在哪。策略没有高低之分,匹配集群现状的才是好策略。