权重轮询调度算法(Weighted Round-Robin Scheduling)-C#实现

在多台机器实现负载均衡的时候,存在调度分配的问题.

如果服务器的配置的处理能力都一致的话,平均轮询分配可以直接解决问题,然而有些时候机器的处理能力是不一致的.

假如有2台机器 A和B , A的处理能力是B的2倍,则A的权重为2,B的权重为1.权值高的服务器先收到的连接,权值高的服 务器比权值低的服务器处理更多的连接,相同权值的服务器处理相同数目的连接数。

算法的C#版如下:文章来源地址:https://www.yii666.com/article/754054.html

 using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace TestConsoleApplication
{
/// <summary>
/// 权重轮询算法
/// </summary>
public static class WeightedRoundRobin
{ private static List<Server> s = new List<Server>()
{
new Server()
{
IP = "192.168.0.100",
Weight =
},
new Server()
{
IP = "192.168.0.101",
Weight =
},
new Server()
{
IP = "192.168.0.102",
Weight =
},
new Server()
{
IP = "192.168.0.103",
Weight =
},
new Server()
{
IP = "192.168.0.104",
Weight =
},
}.OrderBy(a => a.Weight).ToList(); private static int i = -;//代表上一次选择的服务器
private static int gcd = GetGcd(s);//表示集合S中所有服务器权值的最大公约数
private static int cw = ;//当前调度的权值
private static int max = GetMaxWeight(s);
private static int n = s.Count;//服务器个数 /**
* 算法流程:
* 假设有一组服务器 S = {S0, S1, …, Sn-1} ,有相应的权重,变量I表示上次选择的服务器,1每次步长
* 权值cw初始化为0,i初始化为-1 ,当第一次的时候 权值取最大的那个服务器,
* 通过权重的不断递减 寻找 适合的服务器返回,直到轮询结束,权值返回为0
*/
public static Server GetServer()
{
while (true)
{
i = (i + ) % n;
if (i == )
{
cw = cw - gcd;
if (cw <= )
{
cw = max;
if (cw == )
return null;
}
}
if (s[i].Weight >= cw)
{
return s[i];
}
}
} /// <summary>
/// 获取服务器所有权值的最大公约数
/// </summary>
/// <param name="servers"></param>
/// <returns></returns>
private static int GetGcd(List<Server> servers)
{
return ;
}
/// <summary>
/// 获取最大的权值
/// </summary>
/// <param name="servers"></param>
/// <returns></returns>
private static int GetMaxWeight(List<Server> servers)
{
int max = ;
foreach (var s in servers)
{
if (s.Weight > max)
max = s.Weight;
}
return max;
}
}
/// <summary>
/// 服务器结构
/// </summary>
public class Server
{
public string IP;
public int Weight;
} class Program
{
static void Main(string[] args)
{
       Dictionary<string, int> dic = new Dictionary<string, int>();
Server s;
for (int j = ; j < ; j++)
{
s = WeightedRoundRobin.GetServer();
Console.WriteLine("{0},weight:{1}", s.IP, s.Weight); if (!dic.Keys.Contains("服务器" + s.IP + ",权重:" + s.Weight))
dic.Add("服务器" + s.IP + ",权重:" + s.Weight, );
dic["服务器" + s.IP + ",权重:" + s.Weight]++;
} foreach (var i1 in dic)
{
Console.WriteLine("{0}共处理请求{1}次", i1.Key, i1.Value);
} Console.ReadLine();
}
}

运行结果:文章来源地址https://www.yii666.com/article/754054.html

权重轮询调度算法(Weighted Round-Robin Scheduling)-C#实现网址:yii666.com

运行100次的结果统计:文章地址https://www.yii666.com/article/754054.html

权重轮询调度算法(Weighted Round-Robin Scheduling)-C#实现

参考:http://en.wikipedia.org/wiki/Weighted_round_robin网址:yii666.com<

版权声明:本文内容来源于网络,版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。文本页已经标记具体来源原文地址,请点击原文查看来源网址,站内文章以及资源内容站长不承诺其正确性,如侵犯了您的权益,请联系站长如有侵权请联系站长,将立刻删除

权重轮询调度算法(Weighted Round-Robin Scheduling)-C#实现-相关文章

  1. 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现

  2. 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现3

  3. 权重轮询调度算法 java版本号

  4. 权重轮询调度算法(Weighted Round-Robin Scheduling)-C#实现

  5. golang实现权重轮询调度算法

  6. php版权重轮询调度算法

  7. loadbalance轮询算法 java实现

  8. 为什么JAVA要提供 wait/notify 机制?是为了避免轮询带来的性能损失

    wait/notify  机制是为了避免轮询带来的性能损失。为了说清道理,我们用“图书馆借书”这个经典例子来作解释。一本书同时只能借给一个人。现在有一本书,图书馆已经把这本书借了张三。在简单的synchrnozed 同步机制下,李四如果想借,先要去图书馆查看书有没有还回来。李

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信图片_20190322181744_03.jpg

微信扫一扫打赏

请作者喝杯咖啡吧~

支付宝扫一扫领取红包,优惠每天领

二维码1

zhifubaohongbao.png

二维码2

zhifubaohongbao2.png