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

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

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

算法的C#版如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. namespace TestConsoleApplication
  6. {
  7. /// <summary>
  8. /// 权重轮询算法
  9. /// </summary>
  10. public static class WeightedRoundRobin
  11. {
  12.  
  13. private static List<Server> s = new List<Server>()
  14. {
  15. new Server()
  16. {
  17. IP = "192.168.0.100",
  18. Weight =
  19. },
  20. new Server()
  21. {
  22. IP = "192.168.0.101",
  23. Weight =
  24. },
  25. new Server()
  26. {
  27. IP = "192.168.0.102",
  28. Weight =
  29. },
  30. new Server()
  31. {
  32. IP = "192.168.0.103",
  33. Weight =
  34. },
  35. new Server()
  36. {
  37. IP = "192.168.0.104",
  38. Weight =
  39. },
  40. }.OrderBy(a => a.Weight).ToList();
  41.  
  42. private static int i = -;//代表上一次选择的服务器
  43. private static int gcd = GetGcd(s);//表示集合S中所有服务器权值的最大公约数
  44. private static int cw = ;//当前调度的权值
  45. private static int max = GetMaxWeight(s);
  46. private static int n = s.Count;//服务器个数
  47.  
  48. /**
  49. * 算法流程:
  50. * 假设有一组服务器 S = {S0, S1, …, Sn-1} ,有相应的权重,变量I表示上次选择的服务器,1每次步长
  51. * 权值cw初始化为0,i初始化为-1 ,当第一次的时候 权值取最大的那个服务器,
  52. * 通过权重的不断递减 寻找 适合的服务器返回,直到轮询结束,权值返回为0
  53. */
  54. public static Server GetServer()
  55. {
  56. while (true)
  57. {
  58. i = (i + ) % n;
  59. if (i == )
  60. {
  61. cw = cw - gcd;
  62. if (cw <= )
  63. {
  64. cw = max;
  65. if (cw == )
  66. return null;
  67. }
  68. }
  69. if (s[i].Weight >= cw)
  70. {
  71. return s[i];
  72. }
  73. }
  74. }
  75.  
  76. /// <summary>
  77. /// 获取服务器所有权值的最大公约数
  78. /// </summary>
  79. /// <param name="servers"></param>
  80. /// <returns></returns>
  81. private static int GetGcd(List<Server> servers)
  82. {
  83. return ;
  84. }
  85. /// <summary>
  86. /// 获取最大的权值
  87. /// </summary>
  88. /// <param name="servers"></param>
  89. /// <returns></returns>
  90. private static int GetMaxWeight(List<Server> servers)
  91. {
  92. int max = ;
  93. foreach (var s in servers)
  94. {
  95. if (s.Weight > max)
  96. max = s.Weight;
  97. }
  98. return max;
  99. }
  100. }
  101. /// <summary>
  102. /// 服务器结构
  103. /// </summary>
  104. public class Server
  105. {
  106. public string IP;
  107. public int Weight;
  108. }
  109.  
  110. class Program
  111. {
  112. static void Main(string[] args)
  113. {
  114.        Dictionary<string, int> dic = new Dictionary<string, int>();
  115. Server s;
  116. for (int j = ; j < ; j++)
  117. {
  118. s = WeightedRoundRobin.GetServer();
  119. Console.WriteLine("{0},weight:{1}", s.IP, s.Weight);
  120.  
  121. if (!dic.Keys.Contains("服务器" + s.IP + ",权重:" + s.Weight))
  122. dic.Add("服务器" + s.IP + ",权重:" + s.Weight, );
  123. dic["服务器" + s.IP + ",权重:" + s.Weight]++;
  124. }
  125.  
  126. foreach (var i1 in dic)
  127. {
  128. Console.WriteLine("{0}共处理请求{1}次", i1.Key, i1.Value);
  129. }
  130.  
  131. Console.ReadLine();
  132. }
  133. }

运行结果:

运行100次的结果统计:

参考:http://en.wikipedia.org/wiki/Weighted_round_robin

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

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

    权重轮询调度算法(Weighted Round-Robin Scheduling)--java版本号 因为每台server的配置.安装的业务应用等不同.其处理能力会不一样.所以,我们依据server的 ...

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

    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 ----参考Nginx中负载均衡算法实现 与上一遍博客 http://www.cnblogs.com/hu ...

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

    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现3 之前两篇相关博文: 权重轮询调度算法(WeightedRound-RobinScheduling)-Ja ...

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

    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 import java.math.BigInteger; import java.util.ArrayLi ...

  5. 权重轮询调度算法(WeightedRound-RobinScheduling)

    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 ----参考Nginx中负载均衡算法实现 这里主要参考这篇文章的实现: Nginx 负载均衡-加权轮询策略 ...

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

    package main import ( "fmt" "time" ) var slaveDns = map[int]map[string]interface ...

  7. 通过 PowerShell 支持 Azure Traffic Manager 外部端点和权重轮询机制

    Jonathan TulianiAzure网络 - DNS和 Traffic Manager高级项目经理 在北美 TechEd 大会上,我们宣布了 Azure Traffic Manager将支持 ...

  8. Nginx的负载均衡 - 加权轮询 (Weighted Round Robin) 下篇

    Nginx版本:1.9.1 我的博客:http://blog.csdn.net/zhangskd 上篇blog讲述了加权轮询算法的原理.以及负载均衡模块中使用的数据结构,接着我们来看看加权轮询算法的具 ...

  9. Nginx的负载均衡 - 加权轮询 (Weighted Round Robin) 上篇

    Nginx版本:1.9.1 我的博客:http://blog.csdn.net/zhangskd 算法介绍 来看一个简单的Nginx负载均衡配置. http { upstream cluster { ...

随机推荐

  1. iOS常用插件

    iOS常用插件总结:http://blog.csdn.net/oik_ios/article/details/50251191http://www.jianshu.com/p/d24eea8b405a ...

  2. c#面试题及答案

    1:a=10,b=15,在不用第三方变量的前提下,把a,b的值互换2:已知数组int[] max={6,5,2,9,7,4,0};用快速排序算法按降序对其进行排列,并返回数组3:请简述面向对象的多态的 ...

  3. hibernate 问题

    如果hibernate中反转的表中没有主键的话,会生产三个文件. table.java tableADO.java tableId.java 并且在执行findByProperty时,会提示:coul ...

  4. 添加 SecondaryNameNode

    网络上的很多人写的过程都是错的,关键配置反而不写. SecondaryNameNode的启动有两种方式 一:在整个hdfs系统启动时,在namenode上执行start-dfs.sh则namenode ...

  5. Windows Phone 显示长文本

    文采不好,将就着看,见谅 思路最重要,故本文不提供源码下载 参考项目: http://www.windowsphone.com/zh-cn/store/app/%E5%BF%83%E7%90%86fm ...

  6. foreach 和 list.foreach 初步测试

    单纯从速度上讲 小数据量下foreach 较快,list.Foreach 由于 public void ForEach(Action<T> action) { ; i <this._ ...

  7. JMeter2.13进行压力测试

    1.安装 2. 样本数目 总共发送到服务器的请求数. 最新样本 代表时间的数字,是服务器响应最后一个请求的时间 吞吐量 是服务器每分钟处理的请求数. 平均值 是总运行时间除以发送到服务器的请求数. 中 ...

  8. Java 中的构造方法

    首先创建一个Transport类,定义好类的属性和方法,并且写好构造方法,先看下无参数的构造方法: public class Transport { //名字 public String name; ...

  9. Ueditor图片缩放的设置

    最近在用Ueditor,功能绝逼强大,不过也有遗憾的地方,上传图片的时候自动缩放的小了,想要图片按宽度整体等比缩放,找了好久,研究了下,终于找到解决方法了. 先改前台的的dialogs/image/i ...

  10. STM32F4_TIM输入波形捕获(脉冲频率)

    Ⅰ.概述 本文在前面文章“STM32基本的计数原理”的基础上进行拓展,讲述关于“定时器输入捕获”的功能,和上一篇文章“定时器比较输出”区别还是挺大的.在引脚上刚好相反:一个输入.一个输出. 本文只使用 ...