加权轮询和加权随机算法

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

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 值的重复数就越多。

原文地址:https://www.cnblogs.com/kuku/p/8463652.html

时间: 2024-08-03 05:46:35

加权轮询和加权随机算法的相关文章

负载均衡算法(二)加权轮询负载均衡算法

/// <summary> /// 加权轮询算法 /// </summary> public static class WeightRoundRobin { private static object obj = new object(); private static int pos = 0; static Dictionary<string, int> dic = new Dictionary<string, int> { { "192.168

Dubbo加权轮询负载均衡算法应用之推荐产品

Dubbo加权轮询负载均衡算法,核心点:weight(固定的权重),currentWeight(当前权重,动态变化的),算法逻辑:轮询服务提供者(每个服务提供者都有weight和currentWeight),currentWeight增加weight,取最大的currentWeight,然后取对应的服务提供者,最后将取到的服务提供者的currentWeight减去总的权重(所有服务提供者的weight之和).示例如下: 服务器 [A, B, C] 对应权重 [5, 1, 1] ,现在有7个请求依

十四.nginx,web,反向代理,调用加权轮询算法,nfs服务

一.部署nginx反向代理web服务,调度算法使用加权轮询: 1.首先配置一个nginx服务端,三个web客户端.用vmware 新建虚拟机完成,并用xshell连接 2.在服务端和3个web客户端都下载epel_release 和nginx软件包; yum install epel_release -y ;  yum install nginx -y 3.关闭服务端和web客户端的防火墙,在服务端和web客户端都开启nginx软件包并且查看是否开启; 如未开启重新启动nginx: system

平滑加权轮询算法下的降权

func (this *LoadBalance) RoundRobinByWeight3() *HttpServer { //平滑加权轮询 for _, s := range this.Servers { s.CWeight = s.CWeight + s.Weight } sort.Sort(this.Servers) max := this.Servers[0] max.CWeight = max.CWeight - SumWeight return max } 来自为知笔记(Wiz) 原文

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

本文是对于Dubbo负载均衡策略之一的加权随机算法的详细分析.从2.6.4版本聊起,该版本在某些情况下存在着比较严重的性能问题.由问题入手,层层深入,了解该算法在Dubbo中的演变过程,读懂它的前世今生. 之前也写了Dubbo的负载均衡策略: <一文讲透Dubbo负载均衡之最小活跃数算法> <Dubbo一致性哈希负载均衡的源码和Bug,了解一下?> 本文目录 第一节:什么是轮询? 本小节主要是介绍轮询算法和其对应的优缺点.引出加权轮询算法. 第二节:什么是加权轮询? 本小节主要是介

Nginx 负载均衡-加权轮询策略剖析

本文介绍的是客户端请求在多个后端服务器之间的均衡,注意与客户端请求在多个nginx进程之间的均衡相区别(Nginx根据每个工作进程的当前压力调整它们获取监听套接口的几率,那些当前比较空闲的工作进程有更多机会获取到监听套接口,从而客户端的请求到达后也就相应地被它捕获并处理).如果Nginx是以反向代理的形式配置运行,那么对请求的实际处理需要转发到后端服务器运行,如果后端服务器有多台,如何选择一台合适的后端服务器来处理当前请求,就是本文要说的负载均衡.这两种均衡互不冲突并且能同时生效. nginx不

【Nginx】负载均衡-加权轮询策略剖析

转自:江南烟雨 本文介绍的是客户端请求在多个后端服务器之间的均衡,注意与客户端请求在多个nginx进程之间的均衡相区别. 如果Nginx是以反向代理的形式配置运行,那么对请求的实际处理需要转发到后端服务器运行,如果后端服务器有多台,如何选择一台合适的后端服务器来处理当前请求,就是本文要说的负载均衡.这两种均衡互不冲突并且能同时生效. nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态.静态页面的分离,可以按照轮询.ip哈希.URL哈希

平滑加权轮询算法

static void Test1() { var sv = new ServerConfig[] { new ServerConfig{Name="A", Weight = 4}, new ServerConfig{Name="B", Weight = 2}, new ServerConfig{Name="C", Weight = 1} }; int index = 0; int sum = sv.Sum(m => m.Weight);

加权轮询算法

func (this *LoadBalance) RoundRobinByWeight() *HttpServer { server := this.Servers[ServerIndices[this.CurIndex]] this.CurIndex = (this.CurIndex + 1) % len(ServerIndices) //ServersIndices存放的是按照权重排放的索引,如3,1,2 则ServerIndices=[0,0,0,1,2,2] 然后遍历ServerIndi