权重轮询调度算法(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 { ...
随机推荐
- extern “C”调用测试与验证-2016.01.06
1 调用情形说明 在上一篇关于extern “c”原理以及用法中,详细的说明了为什么需要extern “c”以及如何使用它解决c与c++混合编程时遇到的问题.接下来,使用示例验证方式验证c与c++函数 ...
- .NET Reflector反编译的方法
首先启动.NET Reflector,然后添加进入dll或exe.然后选择Export Source Code...,将反编译后的代码文件,生成到指定目录. 到这一步骤时,稍等一会,就能够在指定目录就 ...
- WP8_Json的用法
WP从服务器.API交换数据一般都是用JSON格式字符串. 下面介绍用Newtonsoft.Json来处理JSON. 准备 1.到 http://json.codeplex.com/ 下载Newton ...
- 苹果系列机型专业刷机,解锁,解ID
如有软件开发需求,请留言或在猪八戒网主页留言http://home.zhubajie.com/8506525/,常年接收c.c++(vs2010.RAD studio xe5\RAD studio 2 ...
- Unieap3.5-Grid翻页不提示修改
<toolbar export="{defaultType:'server'}" paging="{onPagingModified:ssSettleCheck.o ...
- POJ 1195
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 13774 Accepted: 6393 De ...
- Memento
#include <iostream> #include <string> using namespace std; class Memento { public: Memen ...
- Hub control
Hub(中心) 中心页是用户进入应用的入口点.中心页在丰富的平移视图中显示内容,这样用户一眼就能看见新鲜有趣的内容,从而吸引他们深入了解你的应用中的更多内容.中心显示不同的内容类别,每个类别映射到应用 ...
- MongoDB(3):小的细节问题
1.文档 {“greeting”:“hello,world”,“foo”: 3} 文档中的键/值对是有序的,下面的文档与上面的文档是完全不同的两个文档. {“foo”: 3 ,“greeting”:“ ...
- highcharts与highstock实例
highcharts实例代码 <head> <title>highcharts报表示例</title> <meta http-equiv="Cont ...