权重轮询调度算法(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掉服务器的演示实例。 由于研究本算法的目的是在其他方面的应用,故涉及服务器请求超时时间等因素,并未考虑。
  1 import java.util.ArrayList;
  2 import java.util.Date;
  3 import java.util.HashMap;
  4 import java.util.List;
  5 import java.util.Map;
  6 import java.util.Map.Entry;
  7
  8 /**
  9  * 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现
 10  * @author huligong
 11  * */
 12 public class WeightedRoundRobinScheduling {
 13
 14     private List<Server> serverList; //服务器集合
 15
 16     public Server GetBestServer() {
 17         Server server = null;
 18         Server best = null;
 19         int total = 0;
 20         for(int i=0,len=serverList.size();i<len;i++){
 21             //当前服务器对象
 22             server = serverList.get(i);
 23
 24             //当前服务器已宕机,排除
 25             if(server.down){
 26                 continue;
 27             }
 28
 29             server.currentWeight += server.effectiveWeight;
 30             total += server.effectiveWeight;
 31
 32             if(server.effectiveWeight < server.weight){
 33                 server.effectiveWeight++;
 34             }
 35
 36             if(best == null || server.currentWeight>best.currentWeight){
 37                 best = server;
 38             }
 39
 40         }
 41
 42         if (best == null) {
 43             return null;
 44         }
 45
 46         best.currentWeight -= total;
 47         best.checkedDate = new Date();
 48         return best;
 49     }
 50
 51
 52
 53     class Server {
 54         public String ip;
 55         public int weight;
 56         public int effectiveWeight;
 57         public int currentWeight;
 58         public boolean down = false;
 59         public Date checkedDate;
 60         public Server(String ip, int weight) {
 61             super();
 62             this.ip = ip;
 63             this.weight = weight;
 64             this.effectiveWeight = this.weight;
 65             this.currentWeight = 0;
 66             if(this.weight < 0){
 67                 this.down = true;
 68             }else{
 69                 this.down = false;
 70             }
 71         }
 72         public String getIp() {
 73             return ip;
 74         }
 75         public void setIp(String ip) {
 76             this.ip = ip;
 77         }
 78         public int getWeight() {
 79             return weight;
 80         }
 81         public void setWeight(int weight) {
 82             this.weight = weight;
 83         }
 84         public int getEffectiveWeight() {
 85             return effectiveWeight;
 86         }
 87         public void setEffectiveWeight(int effectiveWeight) {
 88             this.effectiveWeight = effectiveWeight;
 89         }
 90         public int getCurrentWeight() {
 91             return currentWeight;
 92         }
 93         public void setCurrentWeight(int currentWeight) {
 94             this.currentWeight = currentWeight;
 95         }
 96         public boolean isDown() {
 97             return down;
 98         }
 99         public void setDown(boolean down) {
100             this.down = down;
101         }
102         public Date getCheckedDate() {
103             return checkedDate;
104         }
105         public void setCheckedDate(Date checkedDate) {
106             this.checkedDate = checkedDate;
107         }
108
109     }
110
111
112     public void init() {
113         Server s1 = new Server("192.168.0.100", 3);//3
114         Server s2 = new Server("192.168.0.101", 2);//2
115         Server s3 = new Server("192.168.0.102", 6);//6
116         Server s4 = new Server("192.168.0.103", 4);//4
117         Server s5 = new Server("192.168.0.104", 1);//1
118         Server s6 = new Server("192.168.0.105", 0);//0
119         Server s7 = new Server("192.168.0.106", 0);//0
120         Server s8 = new Server("192.168.0.107", 0);//0
121         Server s9 = new Server("192.168.0.108", 0);//0
122         serverList = new ArrayList<Server>();
123         serverList.add(s1);
124         serverList.add(s2);
125         serverList.add(s3);
126         serverList.add(s4);
127         serverList.add(s5);
128         serverList.add(s6);
129         serverList.add(s7);
130         serverList.add(s8);
131         serverList.add(s9);
132     }
133
134     public void add(int i) {
135         Server s = new Server("192.168.0.1"+i, i-15);
136         serverList.add(s);
137     }
138
139     public Server getServer(int i) {
140         if(i<serverList.size()){
141             return serverList.get(i);
142         }
143        return null;
144     }
145
146
147     public static void main(String[] args) {
148         WeightedRoundRobinScheduling obj = new WeightedRoundRobinScheduling();
149         obj.init();
150
151         Map<String,Integer> countResult = new HashMap<String,Integer>();
152
153         for (int i = 0; i < 100; i++) {
154             Server s = obj.GetBestServer();
155             String log = "ip:"+s.ip+";weight:"+s.weight;
156             if(countResult.containsKey(log)){
157                 countResult.put(log,countResult.get(log)+1);
158             }else{
159                 countResult.put(log,1);
160             }
161             System.out.println(log);
162
163             //动态添加服务器
164             if(i==20 || i==22){
165                   obj.add(i);
166             }
167
168             //动态停止服务器
169             if(i==30){
170                 obj.getServer(2).setDown(true);
171                 obj.getServer(3).setDown(true);
172           }
173         }
174
175         for(Entry<String, Integer> map : countResult.entrySet()){
176             System.out.println("服务器 "+map.getKey()+" 请求次数: "+map.getValue());
177         }
178     }
179
180 }

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

时间: 2024-08-29 11:49:46

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

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

1 import java.math.BigInteger; 2 import java.util.ArrayList; 3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 6 import java.util.Map.Entry; 7 8 /** 9 * 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 10 * @author huligong 1

权重轮询调度算法 java版本

权重轮询调度算法(Weighted Round-Robin Scheduling)--java版本 由于每台服务器的配置.安装的业务应用等不同,其处理能力会不一样.所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求. 2个java源文件,如下所示: public interface IProduceStrategy { public int getPartitionIdForTopic(); } public class WeightFactorPr

golang实现权重轮询调度算法

package main import ( "fmt" "time" ) var slaveDns = map[int]map[string]interface{}{ 0: {"connectstring": "[email protected](172.16.0.164:3306)/shiqu_tools?charset=utf8", "weight": 2}, 1: {"connectstri

轮询算法

在多台机器实现负载均衡的时候,经常用到轮询调度算法(Round-Robin Scheduling). 轮询调度算法就是以循环的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器. 算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度. 1.算法流程:假设有一组服务器 S = {S0, S1, -, Sn-1} ,有相应的权重,变量i表示上次选择的服务器,权值cw初始化为0,i初始化为-1 ,当第一次的时候取权值取最大的那个服

Nginx的继续深入(日志轮询切割,重写,负载均衡等)

Nginx的访问日志轮询切割 通常什么情况Nginx会把所有的访问日志生成到一个制定的访问日志文件access.log里面,但时间一长,日志个头很大不利于日志的分析和处理. 有必要对Nginx日志进行按天或按小时进行切割,分成不同的文件保存. [[email protected] logs]#cat /server/script/cut_nginx_log.sh#!/bin/shDataformat = `date +%Y%m%d`Basedir = "/usr/local/nginx"

LVS负载均衡之IPVSADM命令说明与轮询解释

"1" IPVSADM常用参数说明:-A:在内核的虚拟服务器表中添加一条新的虚拟服务器记录-E:编辑内核虚拟服务器表中的一条虚拟服务器记录-D:删除内核虚拟服务器表中的一条虚拟服务器记录-C:清除内核虚拟服务器表中的所有记录-R:恢复虚拟服务器规则-S:保存虚拟服务器规则,输出为-R选项可读的格式-a:在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录-e:编辑一条虚拟服务器记录中的某条真实服务器记录-d:删除一条虚拟服务器记录中的某条真实服务器记录-L|-l:显示内核虚拟服务器

Android 轮询最佳实践 Service + AlarmManager+Thread

android中涉及到将服务器中数据变化信息通知用户一般有两种办法,推送和轮询. 消息推送是服务端主动发消息给客户端,因为第一时间知道数据发生变化的是服务器自己,所以推送的优势是实时性高.但服务器主动推送需要单独开发一套能让客户端持久连接的服务端程序,不过现在已经有很多开源的代码实现了基于xmmp协议的推送方案,而且还可以使用谷歌的推送方案.但有些情况下并不需要服务端主动推送,而是在一定的时间间隔内客户端主动发起查询. 譬如有这样一个app,实时性要求不高,每天只要能获取10次最新数据就能满足要

Android 轮询之 Service + AlarmManager+Thread (转)

android中涉及到将服务器中数据变化信息通知用户一般有两种办法,推送和轮询. 消息推送是服务端主动发消息给客户端,因为第一时间知道数据发生变化的是服务器自己,所以推送的优势是实时性高.但服务器主动推送需要单独开发一套能让客户端持久连接的服务端程序,不过现在已经有很多开源的代码实现了基于xmmp协议的推送方案,而且还可以使用谷歌的推送方案.但有些情况下并不需要服务端主动推送,而是在一定的时间间隔内客户端主动发起查询. 譬如有这样一个app,实时性要求不高,每天只要能获取10次最新数据就能满足要

关于android 消息轮询处理

android 中涉及到服务器中数据变化信息通知用户一般有两种 办法,推送和轮询,消息推送是服务端主动发消息给客户端,因为第一时间知道数据变化是服务器自己,所以推送的优势是实时性高,但服务器主动推送需要开发一套能让客户端持久链接的服务器 现在已经有很多开源的代码实现了基于XMMP 协议的推送方案,而且还可以使用谷歌的推送方案,但有些情况并不需要服务端主动推送二是在一定的时间间隔客户端发起查询 private MyThread myThread; private NotificationManag