`
m635674608
  • 浏览: 4935285 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

    博客分类:
  • java
 
阅读更多

1. 一般轮询算法

服务器类

Java代码  收藏代码
  1. package com.sosop.roundRobin;  
  2.   
  3. public class Server {  
  4.     private String ip;  
  5.     private int weight;  
  6.       
  7.     public Server(String ip) {  
  8.         super();  
  9.         this.ip = ip;  
  10.     }  
  11.   
  12.     public Server(String ip, int weight) {  
  13.         this.ip     = ip;  
  14.         this.weight = weight;  
  15.     }  
  16.       
  17.     public String getIp() {  
  18.         return ip;  
  19.     }  
  20.     public void setIp(String ip) {  
  21.         this.ip = ip;  
  22.     }  
  23.     public int getWeight() {  
  24.         return weight;  
  25.     }  
  26.     public void setWeight(int weight) {  
  27.         this.weight = weight;  
  28.     }  
  29.   
  30.     @Override  
  31.     public String toString() {  
  32.         return "Server [ip=" + ip + ", weight=" + weight + "]";  
  33.     }     
  34. }  

 实现与测试

Java代码  收藏代码
  1. package com.sosop.roundRobin;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.concurrent.BrokenBarrierException;  
  6. import java.util.concurrent.CyclicBarrier;  
  7.   
  8. public class NormalRoundRobin {  
  9.       
  10.     private List<Server> servers;  
  11.       
  12.     private int currentIndex;  
  13.     private int totalServer;  
  14.       
  15.     public NormalRoundRobin() {  
  16.         servers = new ArrayList<>();  
  17.         servers.add(new Server("192.168.1.2"));  
  18.         servers.add(new Server("192.168.1.3"));  
  19.         servers.add(new Server("192.168.1.4"));  
  20.         servers.add(new Server("192.168.1.5"));  
  21.         servers.add(new Server("192.168.1.6"));  
  22.         servers.add(new Server("192.168.1.7"));  
  23.         servers.add(new Server("192.168.1.8"));  
  24.         totalServer = servers.size();  
  25.         currentIndex = totalServer - 1;  
  26.     }  
  27.   
  28.   
  29.     // 轮询  
  30.     public Server round() {  
  31.         currentIndex = (currentIndex + 1) % totalServer;  
  32.         return servers.get(currentIndex);  
  33.     }  
  34.       
  35.       
  36.     public static void main(String[] args) {  
  37.         final NormalRoundRobin r = new NormalRoundRobin();  
  38.         // 不带并发的轮询  
  39.         for (int i = 0; i < 14; i++) {  
  40.             System.out.println(r.round());  
  41.         }  
  42.           
  43.         System.out.println();  
  44.         System.out.println("==========================");  
  45.         System.out.println();  
  46.           
  47.         final CyclicBarrier b = new CyclicBarrier(14);  
  48.           
  49.         // 带并发的轮询  
  50.         for (int i = 0; i < 14; i++) {  
  51.             new Thread(new Runnable() {  
  52.                 @Override  
  53.                 public void run() {  
  54.                     try {  
  55.                         b.await();  
  56.                         System.out.println(Thread.currentThread().getName() + " " + r.round());  
  57.                     } catch (InterruptedException | BrokenBarrierException e) {  
  58.                         e.printStackTrace();  
  59.                     }  
  60.                 }  
  61.             }, "thread" + i).start();  
  62.         }  
  63.     }  
  64.       
  65. }  

结果:

Server [ip=192.168.1.2, weight=0]
Server [ip=192.168.1.3, weight=0]
Server [ip=192.168.1.4, weight=0]
Server [ip=192.168.1.5, weight=0]
Server [ip=192.168.1.6, weight=0]
Server [ip=192.168.1.7, weight=0]
Server [ip=192.168.1.8, weight=0]
Server [ip=192.168.1.2, weight=0]
Server [ip=192.168.1.3, weight=0]
Server [ip=192.168.1.4, weight=0]
Server [ip=192.168.1.5, weight=0]
Server [ip=192.168.1.6, weight=0]
Server [ip=192.168.1.7, weight=0]
Server [ip=192.168.1.8, weight=0]

==========================

thread13 Server [ip=192.168.1.2, weight=0]
thread4 Server [ip=192.168.1.6, weight=0]
thread3 Server [ip=192.168.1.5, weight=0]
thread1 Server [ip=192.168.1.3, weight=0]
thread12 Server [ip=192.168.1.7, weight=0]
thread0 Server [ip=192.168.1.2, weight=0]
thread2 Server [ip=192.168.1.4, weight=0]
thread10 Server [ip=192.168.1.6, weight=0]
thread11 Server [ip=192.168.1.5, weight=0]
thread8 Server [ip=192.168.1.3, weight=0]
thread9 Server [ip=192.168.1.4, weight=0]
thread7 Server [ip=192.168.1.2, weight=0]
thread6 Server [ip=192.168.1.8, weight=0]
thread5 Server [ip=192.168.1.7, weight=0]

 

2.加权轮询

Java代码  收藏代码
  1. package com.sosop.roundRobin;  
  2.   
  3. import java.math.BigInteger;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import java.util.concurrent.BrokenBarrierException;  
  7. import java.util.concurrent.CyclicBarrier;  
  8.   
  9. public class WeightRoundRobin {  
  10.     private List<Server> servers;  
  11.   
  12.     private int currentIndex;  
  13.     private int totalServer;  
  14.     private int currentWeight;  
  15.     private int maxWeight;  
  16.     private int gcdWeight;  
  17.   
  18.     public WeightRoundRobin() {  
  19.         servers = new ArrayList<>();  
  20.         servers.add(new Server("192.168.1.2"5));  
  21.         servers.add(new Server("192.168.1.3"10));  
  22.         servers.add(new Server("192.168.1.4"15));  
  23.         servers.add(new Server("192.168.1.5"100));  
  24.         servers.add(new Server("192.168.1.6"5));  
  25.         servers.add(new Server("192.168.1.7"20));  
  26.         servers.add(new Server("192.168.1.8"30));  
  27.         totalServer = servers.size();  
  28.         currentIndex = totalServer - 1;  
  29.         maxWeight = maxWeight();  
  30.         gcdWeight = serverGcd();  
  31.     }  
  32.   
  33.     public Server round() {  
  34.         while (true) {  
  35.             currentIndex = (currentIndex + 1) % totalServer;  
  36.             if (currentIndex == 0) {  
  37.                 currentWeight = currentWeight - gcdWeight;  
  38.                 if (currentWeight <= 0) {  
  39.                     currentWeight = maxWeight;  
  40.                     if(currentWeight == 0) {  
  41.                         return null;  
  42.                     }  
  43.                 }  
  44.             }  
  45.               
  46.             if(servers.get(currentIndex).getWeight() >= currentWeight) {  
  47.                 return servers.get(currentIndex);  
  48.             }  
  49.         }  
  50.     }  
  51.   
  52.     /** 
  53.      * 返回所有服务器的权重的最大公约数 
  54.      *  
  55.      * @return 
  56.      */  
  57.     private int serverGcd() {  
  58.         int comDivisor = 0;  
  59.         for (int i = 0; i < totalServer - 1; i++) {  
  60.             if (comDivisor == 0) {  
  61.                 comDivisor = gcd(servers.get(i).getWeight(), servers.get(i + 1).getWeight());  
  62.             } else {  
  63.                 comDivisor = gcd(comDivisor, servers.get(i + 1).getWeight());  
  64.             }  
  65.         }  
  66.         return comDivisor;  
  67.     }  
  68.   
  69.     /** 
  70.      * 获得服务器中的最大权重 
  71.      *  
  72.      * @return 
  73.      */  
  74.     private int maxWeight() {  
  75.         int max = servers.get(0).getWeight();  
  76.         int tmp;  
  77.         for (int i = 1; i < totalServer; i++) {  
  78.             tmp = servers.get(i).getWeight();  
  79.             if (max < tmp) {  
  80.                 max = tmp;  
  81.             }  
  82.         }  
  83.         return max;  
  84.     }  
  85.   
  86.     /** 
  87.      * 求两个数的最大公约数 4和6最大公约数是2 
  88.      *  
  89.      * @param num1 
  90.      * @param num2 
  91.      * @return 
  92.      */  
  93.     private int gcd(int num1, int num2) {  
  94.         BigInteger i1 = new BigInteger(String.valueOf(num1));  
  95.         BigInteger i2 = new BigInteger(String.valueOf(num2));  
  96.         return i1.gcd(i2).intValue();  
  97.     }  
  98.   
  99.     public static void main(String[] args) {  
  100.         final WeightRoundRobin wr = new WeightRoundRobin();  
  101.         // 非并发情况  
  102.         for (int i = 0; i < 100; i++) {  
  103.             System.out.println(wr.round());  
  104.         }  
  105.           
  106.         System.out.println();  
  107.         System.out.println("==========");  
  108.         System.out.println();  
  109.           
  110.         final CyclicBarrier b = new CyclicBarrier(30);  
  111.         // 并发情况  
  112.         for (int i = 0; i < 30; i++) {  
  113.             new Thread(new Runnable() {  
  114.                 @Override  
  115.                 public void run() {  
  116.                     try {  
  117.                         b.await();  
  118.                         System.out.println(Thread.currentThread().getName() + " " + wr.round());  
  119.                     } catch (InterruptedException | BrokenBarrierException e) {  
  120.                         e.printStackTrace();  
  121.                     }  
  122.                 }  
  123.             }, "thread" + i).start();  
  124.         }  
  125.     }  
  126. }  

 

结果:

Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.3, weight=10]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.2, weight=5]
Server [ip=192.168.1.3, weight=10]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.6, weight=5]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.3, weight=10]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.2, weight=5]
Server [ip=192.168.1.3, weight=10]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.6, weight=5]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.3, weight=10]

==========

thread0 Server [ip=192.168.1.5, weight=100]
thread3 Server [ip=192.168.1.2, weight=5]
thread7 Server [ip=192.168.1.6, weight=5]
thread10 Server [ip=192.168.1.5, weight=100]
thread12 Server [ip=192.168.1.5, weight=100]
thread15 Server [ip=192.168.1.5, weight=100]
thread18 Server [ip=192.168.1.5, weight=100]
thread2 Server [ip=192.168.1.8, weight=30]
thread29 Server [ip=192.168.1.5, weight=100]
thread1 Server [ip=192.168.1.7, weight=20]
thread27 Server [ip=192.168.1.8, weight=30]
thread26 Server [ip=192.168.1.5, weight=100]
thread25 Server [ip=192.168.1.8, weight=30]
thread24 Server [ip=192.168.1.5, weight=100]
thread23 Server [ip=192.168.1.5, weight=100]
thread22 Server [ip=192.168.1.5, weight=100]
thread21 Server [ip=192.168.1.5, weight=100]
thread20 Server [ip=192.168.1.5, weight=100]
thread19 Server [ip=192.168.1.5, weight=100]
thread17 Server [ip=192.168.1.5, weight=100]
thread16 Server [ip=192.168.1.5, weight=100]
thread14 Server [ip=192.168.1.5, weight=100]
thread13 Server [ip=192.168.1.5, weight=100]
thread11 Server [ip=192.168.1.5, weight=100]
thread9 Server [ip=192.168.1.8, weight=30]
thread8 Server [ip=192.168.1.7, weight=20]
thread6 Server [ip=192.168.1.5, weight=100]
thread5 Server [ip=192.168.1.4, weight=15]
thread4 Server [ip=192.168.1.3, weight=10]
thread28 Server [ip=192.168.1.5, weight=100]

分享到:
评论

相关推荐

    加权轮询调度算法DWRR

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

    Nginx平滑的基于权重的轮询算法实现

    Nginx平滑的基于权重轮询算法描述为: Algorithm is as follows: on each peer selection we increase current_weight of each eligible peer by its weight, select peer with greatest current_weight and reduce ...

    负载均衡应用服务器控制用户的算法

    轮询调度算法(Round-Robin Scheduling)和权重轮询调度算法的比较,在分布式软件系统中,集中控制多台服务器每台登陆用户的算法。

    Storm环境下基于权重的任务调度算法

    针对这一问题,提出 一种Storm环境下基于权重的任务调度算法(TSAW-Storm)。该算法首先根据各任务的CPU资源占用情况以及任务间的数据流大小,分别确定拓扑的点权和边权; 并利用最大化边权增益的思想,逐步构建起各...

    论文研究-一种基于CICQ支持组播公平服务的调度策略.pdf

    针对目前基于CICQ(combined input and crosspoint queuing)支持组播的调度策略在公平性和实时性能保障方面存在的不足,提出了一种简单、高效的支持组播公平服务的分层平滑轮询调度算法——mFGSR (multicast fair ...

    关于传输虚拟化中数据分组乱序问题的研究

    从静态的路径选择机制以及动态的数据分组调度模型方面分析了造成接收端数据分组乱序的主要原因,提出了基于路径往返时间的路径选择机制和基于权重轮询调度算法、时延均衡技术的数据分组调度模型。理论分析和仿真实验...

    LVS-NAT集群.doc

    使用LVS实现NAT模式的集群调度服务器,为用户提供Web服务 集群对外公网IP地址为192.168.4.5 调度器内网IP地址为192.168.2.5 真实Web服务器地址分别为192.168.2.100、...使用加权轮询调度算法,真实服务器权重分别为1和2

    城市交通智能疏导系统(Smart City) --Beta版

    3 实现了简单的调度算法 a 按照相位轮询 b 按照相位权重分配时间 c 按照相位车辆分配时间 项目简介: 这是一个使用VC++编写的城市交通疏导系统模拟平台,用户可以在这个平台的基础上开发自己的路口调度算法,...

    城市交通智能疏导系统(Smart City)_VIP版

    3 实现了简单的调度算法 a 按照相位轮询 b 按照相位权重分配时间 c 按照相位车辆分配时间 项目简介: 这是一个使用VC++编写的城市交通疏导系统模拟平台,用户可以在这个平台的基础上开发自己的路口调度算法,...

    基于docker容器的高并发web系统架构设计与实现.caj

    《基于docker容器的高并发web系统架构设计与实现》随着互联网迅速发展,社交、媒体以及电商等web网站用户数量 越来越大,并发流量也越来越高,这对于传统web系统架构设计提出 新的挑战。本文基于...

    Nginx负载均衡

    负载均衡调度算法 轮询(rr) :按时间顺序逐一分配到不同的后端服务器(默认) 权重(weight):加权轮询(wrr)。weight值越大,分配到的访问率越高。 源IP地址hash调度方法(ip_hash):将每个请求按访问IP的hash值来分配,...

Global site tag (gtag.js) - Google Analytics