轮询相关算法

普通轮询

n:请求的编号 x:服务器数量 i:请求的服务器编号 i = n % x

加权轮询

最大公约数算法(Weighted Round-Robin, WRR)

随着每一轮遍历,降低“门槛”(Current Weight),只有权重大于等于当前门槛的服务器才能被选中,最大公约数是为了简化权重

权重 2:4:8 --> 1:2:4没区别

核心思路:

  • 找出所有权重的最大公约数(GCD)。
  • 将每个权重除以 GCD,得到“简化权重”。
  • 每一轮调度中,每个服务器最多被选中与其简化权重相等的次数。
  • 使用一个“当前权重计数器”(current_weight)从最大简化权重开始递减,每次选择权重 ≥ current_weight 的服务器。
  • 当 current_weight 减到 0 时,重置为最大简化权重,继续下一轮。

缺点:

固定权重的分配完后才能轮到其他权重的

eg:

A:4

B:2

C:6

最大公约数 GCD(4,2,6) = 2

简化权重 = 2:1:3

最大简化权重 max_weight = max([2, 1, 3]) = 3

开始计算

初始化 current_weight = max_weight = 3

第一轮

门槛 current_weight = 3

2 - 1 - 3(符合)

设置 current_weight--

结果 6

第二轮

门槛 current_weight = 2

2(符合) - 1 - 3(符合)

设置 current_weight--

结果 4 6

第三轮

门槛 current_weight = 1

2(符合) - 1(符合) - 3(符合)

设置 current_weight--

结果 4 2 6

因此,最终结果是 6-4-6-4-2-6的顺序

第四轮(重置,循环)

门槛 current_weight = 0,重置成3

2 - 1 - 3(符合)

结果 6

可以看出来,最终6-4-6-4-2-6这种分布并不均匀,如果权重是4-2-1更明显,权重大的优先分配以后才轮到低权重的

平滑加权轮询算法(Smooth Weighted Round-Robin, SWRR)

核心思路:

每个服务器有两个权重值:weight:原始权重(不变),current_weight:当前权重cw(动态变化)

每次选择 cw 最大的服务器

计算累计当前 cw 为 tw

选中后:将该服务器的 cw 减去 tw

判断是否所有 cw 都是0,是则退出循环

否则每个服务器的 cw 都加上各自的 weight

posted @ 2025-12-09 20:49  一只盐桔鸡  阅读(3)  评论(0)    收藏  举报