权重轮询调度算法(Weighted Round-Robin Scheduling)-C#实现
在多台机器实现负载均衡的时候,存在调度分配的问题.
如果服务器的配置的处理能力都一致的话,平均轮询分配可以直接解决问题,然而有些时候机器的处理能力是不一致的.
假如有2台机器 A和B , A的处理能力是B的2倍,则A的权重为2,B的权重为1.权值高的服务器先收到的连接,权值高的服 务器比权值低的服务器处理更多的连接,相同权值的服务器处理相同数目的连接数。
算法的C#版如下:
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();
}
}
运行结果:
运行100次的结果统计:
参考:http://en.wikipedia.org/wiki/Weighted_round_robin
权重轮询调度算法(Weighted Round-Robin Scheduling)-C#实现的更多相关文章
- 权重轮询调度算法 java版本号
权重轮询调度算法(Weighted Round-Robin Scheduling)--java版本号 因为每台server的配置.安装的业务应用等不同.其处理能力会不一样.所以,我们依据server的 ...
- 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现2
权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 ----参考Nginx中负载均衡算法实现 与上一遍博客 http://www.cnblogs.com/hu ...
- 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现3
权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现3 之前两篇相关博文: 权重轮询调度算法(WeightedRound-RobinScheduling)-Ja ...
- 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现
权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 import java.math.BigInteger; import java.util.ArrayLi ...
- 权重轮询调度算法(WeightedRound-RobinScheduling)
权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 ----参考Nginx中负载均衡算法实现 这里主要参考这篇文章的实现: Nginx 负载均衡-加权轮询策略 ...
- golang实现权重轮询调度算法
package main import ( "fmt" "time" ) var slaveDns = map[int]map[string]interface ...
- 通过 PowerShell 支持 Azure Traffic Manager 外部端点和权重轮询机制
Jonathan TulianiAzure网络 - DNS和 Traffic Manager高级项目经理 在北美 TechEd 大会上,我们宣布了 Azure Traffic Manager将支持 ...
- Nginx的负载均衡 - 加权轮询 (Weighted Round Robin) 下篇
Nginx版本:1.9.1 我的博客:http://blog.csdn.net/zhangskd 上篇blog讲述了加权轮询算法的原理.以及负载均衡模块中使用的数据结构,接着我们来看看加权轮询算法的具 ...
- Nginx的负载均衡 - 加权轮询 (Weighted Round Robin) 上篇
Nginx版本:1.9.1 我的博客:http://blog.csdn.net/zhangskd 算法介绍 来看一个简单的Nginx负载均衡配置. http { upstream cluster { ...
随机推荐
- dell N1500 安全配置
http://www.dell.com/Support/Article/us/en/19/HOW10832 Setting a management IP address A reachable IP ...
- 【MySQL】MySQL索引背后的之使用策略及优化【转】
转自:http://database.ctocio.com.cn/353/11664853.shtml 另外很不错的对于索引及索引优化的文章: http://www.cnblogs.com/magia ...
- JS常用的设计模式(12)—— 迭代器模式
迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示. js中我们经常会封装一个each函数用来实现迭代器. array的迭代器: forEach = functio ...
- oracle线程数更改
查看Oracle最大进程数: SQL> select count(*) from v$session #连接数,查看更多oracle数据库的疑问, 可点击cuug官网.http://www.cu ...
- pig中变量
pig中的变量都是找到$变量然后替换,有点像宏,完全就是替换,看如下例子 %default m 'you';b = load 'a' as (a:chararray);c = foreach b ge ...
- vim的.vimrc文件设置
set nocompatibleset autowriteset autoreadset nobackupset noswapfile " --- syntax and indent --- ...
- 爱拼图游戏android源码完整版
这个是一款爱拼图游戏源码完整版,该游戏源码比较完整的,可以支持音乐的播放在游戏的玩的过程中,还可以控制系统的声音等,可以支持多种图片的选择来进行玩的,还可以根据自己的爱好选择不同的难度来的,级别分为: ...
- php的命名规范
1.类 类名每一个单词首字母大写,如类名StudentCourse. 2.常量 常量名所有字母大写,单词间用下划线分隔,如常量名NULL.TRUE.FALSE.ROOT_PATH等. 3.变量 为了保 ...
- js对文章内容进行分页示例代码
这篇文章主要介绍了使用js对文章内容进行分页的具体实现,需要的朋友可以参考下 Thinkphp中文章显示代码: 代码如下: <div id="showContent"> ...
- 9)Java内部类(Inner Class)
内部类:不可以有静态数据,静态方法或者又一个静态内部类 内部类的优点:隐藏类的细节,内部类可以声明为私有.内部类可以访问外部类的对象(包括private) 静态内部类:可以有静态数据,静 ...