权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现2
权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现
----参考Nginx中负载均衡算法实现 与上一遍博客 http://www.cnblogs.com/huligong1234/p/3819979.html 中实现方式不同,
这里主要参考这篇文章的实现: Nginx 负载均衡-加权轮询策略剖析 http://www.cnblogs.com/dyllove98/archive/2013/07/13/3188450.html,
与上一遍中实现比起来,效果比较好,权重比较低的服务器,也比较容易背获取到,但请求数量比较大的时候,两个实现方式中,每个服务器分担的请求数基本无差别,区别主要是顺序上。
本篇文章也加上了动态添加服务器,和动态down掉服务器的演示实例。 由于研究本算法的目的是在其他方面的应用,故涉及服务器请求超时时间等因素,并未考虑。
import java.util.ArrayList;
import java.util.Date;
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 List<Server> serverList; //服务器集合 public Server GetBestServer() {
Server server = null;
Server best = null;
int total = 0;
for(int i=0,len=serverList.size();i<len;i++){
//当前服务器对象
server = serverList.get(i); //当前服务器已宕机,排除
if(server.down){
continue;
} server.currentWeight += server.effectiveWeight;
total += server.effectiveWeight; if(server.effectiveWeight < server.weight){
server.effectiveWeight++;
} if(best == null || server.currentWeight>best.currentWeight){
best = server;
} } if (best == null) {
return null;
} best.currentWeight -= total;
best.checkedDate = new Date();
return best;
} class Server {
public String ip;
public int weight;
public int effectiveWeight;
public int currentWeight;
public boolean down = false;
public Date checkedDate;
public Server(String ip, int weight) {
super();
this.ip = ip;
this.weight = weight;
this.effectiveWeight = this.weight;
this.currentWeight = 0;
if(this.weight < 0){
this.down = true;
}else{
this.down = false;
}
}
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 int getEffectiveWeight() {
return effectiveWeight;
}
public void setEffectiveWeight(int effectiveWeight) {
this.effectiveWeight = effectiveWeight;
}
public int getCurrentWeight() {
return currentWeight;
}
public void setCurrentWeight(int currentWeight) {
this.currentWeight = currentWeight;
}
public boolean isDown() {
return down;
}
public void setDown(boolean down) {
this.down = down;
}
public Date getCheckedDate() {
return checkedDate;
}
public void setCheckedDate(Date checkedDate) {
this.checkedDate = checkedDate;
} } 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);//
Server s6 = new Server("192.168.0.105", 0);//
Server s7 = new Server("192.168.0.106", 0);//
Server s8 = new Server("192.168.0.107", 0);//
Server s9 = new Server("192.168.0.108", 0);//
serverList = new ArrayList<Server>();
serverList.add(s1);
serverList.add(s2);
serverList.add(s3);
serverList.add(s4);
serverList.add(s5);
serverList.add(s6);
serverList.add(s7);
serverList.add(s8);
serverList.add(s9);
} public void add(int i) {
Server s = new Server("192.168.0.1"+i, i-15);
serverList.add(s);
} public Server getServer(int i) {
if(i<serverList.size()){
return serverList.get(i);
}
return null;
} 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.GetBestServer();
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); //动态添加服务器
if(i==20 || i==22){
obj.add(i);
} //动态停止服务器
if(i==30){
obj.getServer(2).setDown(true);
obj.getServer(3).setDown(true);
}
} for(Entry<String, Integer> map : countResult.entrySet()){
System.out.println("服务器 "+map.getKey()+" 请求次数: "+map.getValue());
}
} }
权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现2的更多相关文章
- 权重轮询调度算法(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 ...
- 权重轮询调度算法 java版本号
权重轮询调度算法(Weighted Round-Robin Scheduling)--java版本号 因为每台server的配置.安装的业务应用等不同.其处理能力会不一样.所以,我们依据server的 ...
- 权重轮询调度算法(WeightedRound-RobinScheduling)
权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 ----参考Nginx中负载均衡算法实现 这里主要参考这篇文章的实现: Nginx 负载均衡-加权轮询策略 ...
- 权重轮询调度算法(Weighted Round-Robin Scheduling)-C#实现
在多台机器实现负载均衡的时候,存在调度分配的问题. 如果服务器的配置的处理能力都一致的话,平均轮询分配可以直接解决问题,然而有些时候机器的处理能力是不一致的. 假如有2台机器 A和B , A的处理能力 ...
- 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将支持 ...
- php版权重轮询调度算法
2013-09-25 <?php class WeightedRoundRobin { private static $_weightArray = array(); private stati ...
- 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#
负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...
随机推荐
- The Practice of .NET Cross-Platforms
0x01 Preface This post is mainly to share the technologies on my practice about the .NET Cross-Platf ...
- IoC原理-使用反射/Emit来实现一个最简单的IoC容器
从Unity到Spring.Net,到Ninject,几年来陆陆续续用过几个IoC框架.虽然会用,但也没有一直仔细的研究过IoC实现的过程.最近花了点时间,下了Ninject的源码,研究了一番,颇有收 ...
- 常用的WebForm 控件
首先回忆一下Html页中的12个表单元素 .文本类 文本框 <input type="text" id="" name="" valu ...
- SQL存储过程分页(通用的拼接SQL语句思路实现)
多表通用的SQL存储过程分页 案例一: USE [Community] GO /****** Object: StoredProcedure [dbo].[Common_PageList] Scrip ...
- SSH整合(struts2.3.24+hibernate3.6.10+spring4.3.2+mysql5.5+myeclipse8.5+tomcat6+jdk1.6)
终于开始了ssh的整合,虽然现在比较推崇的是,ssm(springmvc+spring+mybatis)这种框架搭配确实比ssh有吸引力,因为一方面springmvc本身就是遵循spring标准,所以 ...
- Linux中shell脚本自动输入密码
最近遇到蛋疼的事,就是在shell脚本中需要获取root权限,因此在shell脚本运行过程中需要输入密码. 懒惰的我当然想让shell在执行过程中就可以自动输入密码,这样就可以抽空看看妹子图.. 我通 ...
- 前端工程师如何快速的开发一个微信JSSDK应用
亲们,订阅号出来已经很久了,作为一个前端工程师或者全栈工程师,你是不是错过了什么?大概许多攻城狮同砚还没有反应过来订阅号怎么回事,就马上要被微信的应用号秀一脸了.在应用号还没有正式出来之前,我们赶紧一 ...
- CSS的::selection使用方法
请选择本页面文本看看:http://hovertree.com/h/bjaf/38hq6y9d.htm CSS改变默认文本选中的颜色的方法 一般情况下在网页里的文本我们用鼠标选中的时候都是蓝色的,这个 ...
- tomcat远程调试javaweb
当把一个本地项目部署到远程服务器后有可能出现意想不到错误,这个时候通过远程调试能够更清楚的找到bug所在位置. 目前百度tomcat绝大多数方法都是在startup.sh或者catalina.sh增加 ...
- javascript 函数初探 (一)--- 神马是函数
神马是函数? 所谓函数,本质上是一种代码的分组形式.我们可以通过这种形式赋予某组代码一个名字,以便与之后的调用.下面,我们来示范以下函数的声明: function sum(a, b){ var c = ...