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

 import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry; /**
* 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现
* @author huligong
* */
public class WeightedRoundRobinScheduling { private int currentIndex = -1;// 上一次选择的服务器
private int currentWeight = 0;// 当前调度的权值
private int maxWeight = 0; // 最大权重
private int gcdWeight = 0; //所有服务器权重的最大公约数
private int serverCount = 0; //服务器数量
private List<Server> serverList; //服务器集合 /**
* 返回最大公约数
* @param a
* @param b
* @return
*/
private static int gcd(int a, int b) {
BigInteger b1 = new BigInteger(String.valueOf(a));
BigInteger b2 = new BigInteger(String.valueOf(b));
BigInteger gcd = b1.gcd(b2);
return gcd.intValue();
} /**
* 返回所有服务器权重的最大公约数
* @param serverList
* @return
*/
private static int getGCDForServers(List<Server> serverList ) {
int w = 0;
for (int i = 0, len = serverList.size(); i < len - 1; i++) {
if (w == 0) {
w = gcd(serverList.get(i).weight, serverList.get(i + 1).weight);
} else {
w = gcd(w, serverList.get(i + 1).weight);
}
}
return w;
} /**
* 返回所有服务器中的最大权重
* @param serverList
* @return
*/
public static int getMaxWeightForServers(List<Server> serverList) {
int w = 0;
for (int i = 0, len = serverList.size(); i < len - 1; i++) {
if (w == 0) {
w = Math.max(serverList.get(i).weight, serverList.get(i + 1).weight);
} else {
w = Math.max(w, serverList.get(i + 1).weight);
}
}
return w;
} /**
* 算法流程:
* 假设有一组服务器 S = {S0, S1, …, Sn-1}
* 有相应的权重,变量currentIndex表示上次选择的服务器
* 权值currentWeight初始化为0,currentIndex初始化为-1 ,当第一次的时候返回 权值取最大的那个服务器,
* 通过权重的不断递减 寻找 适合的服务器返回,直到轮询结束,权值返回为0
*/
public Server GetServer() {
while (true) {
currentIndex = (currentIndex + 1) % serverCount;
if (currentIndex == 0) {
currentWeight = currentWeight - gcdWeight;
if (currentWeight <= 0) {
currentWeight = maxWeight;
if (currentWeight == 0)
return null;
}
}
if (serverList.get(currentIndex).weight >= currentWeight) {
return serverList.get(currentIndex);
}
}
} class Server {
public String ip;
public int weight;
public Server(String ip, int weight) {
super();
this.ip = ip;
this.weight = weight;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
} public void init() {
Server s1 = new Server("192.168.0.100", 3);//
Server s2 = new Server("192.168.0.101", 2);//
Server s3 = new Server("192.168.0.102", 6);//
Server s4 = new Server("192.168.0.103", 4);//
Server s5 = new Server("192.168.0.104", 1);//
serverList = new ArrayList<Server>();
serverList.add(s1);
serverList.add(s2);
serverList.add(s3);
serverList.add(s4);
serverList.add(s5); currentIndex = -1;
currentWeight = 0;
serverCount = serverList.size();
maxWeight = getMaxWeightForServers(serverList);
gcdWeight = getGCDForServers(serverList);
} public static void main(String[] args) {
WeightedRoundRobinScheduling obj = new WeightedRoundRobinScheduling();
obj.init(); Map<String,Integer> countResult = new HashMap<String,Integer>(); for (int i = 0; i < 100; i++) {
Server s = obj.GetServer();
String log = "ip:"+s.ip+";weight:"+s.weight;
if(countResult.containsKey(log)){
countResult.put(log,countResult.get(log)+1);
}else{
countResult.put(log,1);
}
System.out.println(log);
} for(Entry<String, Integer> map : countResult.entrySet()){
System.out.println("服务器 "+map.getKey()+" 请求次数: "+map.getValue());
}
} }

权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现的更多相关文章

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

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

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

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

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

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

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

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

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

    在多台机器实现负载均衡的时候,存在调度分配的问题. 如果服务器的配置的处理能力都一致的话,平均轮询分配可以直接解决问题,然而有些时候机器的处理能力是不一致的. 假如有2台机器 A和B , A的处理能力 ...

  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. php版权重轮询调度算法

    2013-09-25 <?php class WeightedRoundRobin { private static $_weightArray = array(); private stati ...

  9. 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#

    负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...

随机推荐

  1. 光学字符识别OCR-5 文本切割

    经过前面文字定位得到单行的文本区域之后,我们就可以想办法将单行的文本切割为单个的字符了.因为第三步的模型是针对单个的字符建立的,因此这一步也是必须的. 均匀切割 基于方块汉字的假设,事实上最简单的切割 ...

  2. 基于EPOLL模型的局域网聊天室和Echo服务器

    一.EPOLL的优点 在Linux中,select/poll/epoll是I/O多路复用的三种方式,epoll是Linux系统上独有的高效率I/O多路复用方式,区别于select/poll.先说sel ...

  3. 大数据学习——spark笔记

    变量的定义 val a: Int = 1 var b = 2 方法和函数 区别:函数可以作为参数传递给方法 方法: def test(arg: Int): Int=>Int ={ 方法体 } v ...

  4. Django创建并连接数据库(实现增删改查)--第二版

    注意点一: url里面的地址,不只是html页面,准确说是views视图里面对应的函数方法 <!DOCTYPE html> <html lang="en"> ...

  5. Spring @注解详解(转)

    1.@controller 控制器(注入服务) 2.@service 服务(注入dao) 3.@repository dao(实现dao访问) 4.@component (把普通pojo实例化到spr ...

  6. linux工作笔记

    1. Linux基础 1.1. Unix 1965年,AT&T贝尔电话实验室.通用电气公司.麻省理工学院MAC课题组一起联合开发一个称为Multics的新操作系统.该项目目的是让大型主机可以同 ...

  7. ACM程序设计选修课——1018: Common Subsequence(DP)

    问题 L: Common Subsequence 时间限制: 1 Sec  内存限制: 32 MB 提交: 70  解决: 40 [提交][状态][讨论版] 题目描述 A subsequence of ...

  8. djang中的request.user对象中的方法

    print(dir(request.user)) ['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', ...

  9. 事件获取目标 currentTarget target srcElement三者之间的区别和联系

    currentTarget   指的是触发事件的当前对象,可以是冒泡和捕获的对象,不一定是点击或者鼠标移入等事件的直接触发对象.可以是他的父元素等. target 指的是事件触发的直接对象.IE有兼容 ...

  10. 【CF1025C】Plasticine zebra(模拟)

    题意: n<=1e5 思路:可以证明答案即为极长交替出现的串长度之和 需要注意其实这个串是一个环,复制后再做 #include<cstdio> #include<cstring ...