nginx中的平滑加权轮询算法

该算法可以均匀的按照权重轮询。

轮询策略:

请求序号 | 选中之前权值 | 选中 | 选中之后
----|------|----
1 | 4,2,1 | a|-3,2,1
2 | 1,4,2 | b|1,-3,2
3| 5,-1,3|a|-2,-1,3
4|2,1,4|c|2,1,-3
5|6,3,-2|a|-1,3,-2
6|3,5,-1|b|3,-2,-1
7|7,0,0|a|0,0,0

示例:比如第一次请求,选权值最高的a(非常显然),选完之后,命中者的权值减掉权值和(4+2+1=7),得到-3,2,1, 然后再加上原权值(4,2,1),变成(1,4,2)。

第二次请求,选权值最高的b(非常显然),选完之后,命中者的权值减掉原权值和(4+2+1=7),得到1,-3,2, 然后再加上原权值(4,2,1),变成(5,-1,3)。

 

代码实现如下:

 public static void main(String[] args) {
        int oa = 4;
        int ob = 2;
        int oc = 1;
        
        int sum = oa + ob + oc;
        
        int a = 4;
        int b = 2;
        int c = 1;

        int ca = 0;
        int cb = 0;
        int cc = 0;

        for (int i = 0; i < 80; i++) {
            if (a > b) {
                if (a > c) {
                    ca++;
                    a = a - sum;
                    a += oa;
                    b += ob;
                    c += oc;
                } else {
                    cc++;
                    c = c - sum;
                    a += oa;
                    b += ob;
                    c += oc;
                }
            } else {
                if (b > c) {
                    cb++;
                    b = b - sum;
                    a += oa;
                    b += ob;
                    c += oc;
                } else {
                    cc++;
                    c = c - sum;
                    a += oa;
                    b += ob;
                    c += oc;
                }
            }
        }
        System.out.println("ca:" + ca);
        System.out.println("cb:" + cb);
        System.out.println("cc:" + cc);
    }

 



参考自:https://www.jianshu.com/p/f941c9b46748

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值