加权轮询和加权随机算法

Posted kuku

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加权轮询和加权随机算法相关的知识,希望对你有一定的参考价值。

今天在看《大型分布式网站架构设计与实践》一书中, 看到了一种比较简单的加权的算法, 在这里记下来:

 

var serverWeightMap = new Dictionary<string, int>();
serverWeightMap.Add("192.168.1.100", 1);
serverWeightMap.Add("192.168.1.101", 1);

// 权重为 4
serverWeightMap.Add("192.168.1.102", 4);
serverWeightMap.Add("192.168.1.103", 1);
serverWeightMap.Add("192.168.1.104", 1);

// 权重为 3
serverWeightMap.Add("192.168.1.105", 3);
serverWeightMap.Add("192.168.1.106", 1);

// 权重为 2
serverWeightMap.Add("192.168.1.107", 2);
serverWeightMap.Add("192.168.1.108", 1);
serverWeightMap.Add("192.168.1.109", 1);
serverWeightMap.Add("192.168.1.110", 1);


int pos = 0;
// 加权轮询
public static string getRoundRobin()
{
    List<string> ipList = new List<string>();
    foreach(var key in serverWeightMap.Keys)
    {
        var weight = serverWeightMap[key];
        for(var i = 0; i < weight; i++)
            ipList.Add(key);
    }

    var ip = string.Empty;
    lock(pos)
    {
        if(pos > ipList.Count)
            pos = 0;

        ip = ipList[pos];
        pos++;
    }

    return ip;
}

// 加权随机
public static string getRandom()
{
    List<string> ipList = new List<string>();
    foreach(var key in serverWeightMap.Keys)
    {
        var weight = serverWeightMap[key];
        for(var i = 0; i < weight; i++)
            ipList.Add(key);
    }

    var randPos = Convert.ToInt32((new Random()).Next(ipList.Count));
    var ip = ipList[randPos];

    return ip;
}

  上面的两个方法中, 就处理服务器 IP 地址的时候, 根据权重的不同, 在 IP  列表中重复添加 IP 值,权重越大, IP 列表中 IP 值的重复数就越多。

以上是关于加权轮询和加权随机算法的主要内容,如果未能解决你的问题,请参考以下文章

Dubbo加权轮询负载均衡的源码和Bug,了解一下?

平滑的加权轮询均衡算法

干货 | JAVA面试题(架构篇)

Dubbo加权轮询负载均衡的源码和Bug,了解一下?

实现一个简单的加权轮询算法

手把手教你写出 6 种负载均衡算法!