权重轮询算法,生成加权随机数

相信熟悉过Nginx的都知道,Nginx其中有一个功能是负载均衡。

Nginx的负载均衡里可以配置一个服务器列表,如:

 

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. upstream detecotr_server {  
  2.             #ip_hash;    
  3.                 #这里指定多个源服务器,ip:端口,80端口的话可写可不写    
  4.                 server 192.168.154.1:8080 weight=1;# max_fails=2 fails_time=2;    
  5.                 server 192.168.154.2:8088 weight=2;# max_fail2=2 fails_time=2;    
  6.         }   

当负载均衡策略为加权轮询,如果的3个请求,则会有1个请求分发到192.168.154.1服务器上,2个请求分发到192.168.154.2服务器上。

 

现在使用加权随机数来模拟来加权轮询算法,当一个请求过来的时候,根据不同服务器对应的的权值,随机返回处理请求的服务器。

 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. public class WeightRandom {  
  2.       
  3.     public static Map<String, Integer> servers = new HashMap<String, Integer>();  
  4.   
  5.     static{  
  6.         servers.put("192.168.20.101"1);  
  7.         servers.put("192.168.20.102"2);  
  8.         servers.put("192.168.20.103"3);  
  9.         servers.put("192.168.20.104"4);  
  10.     }  
  11.       
  12.     public static String selectServer(Map<String, Integer> servers){  
  13.         if(servers == null || servers.size() == 0return null;  
  14.           
  15.         Integer sum = 0;  
  16.         Set<Map.Entry<String, Integer>> entrySet = servers.entrySet();  
  17.         Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();  
  18.         while(iterator.hasNext()){  
  19.             sum += iterator.next().getValue();  
  20.         }  
  21.         Integer rand = new Random().nextInt(sum) + 1;  
  22.         for(Map.Entry<String, Integer> entry : entrySet){  
  23.             rand -= entry.getValue();  
  24.             if(rand <=0){  
  25.                 return entry.getKey();  
  26.             }  
  27.         }  
  28.           
  29.         return null;  
  30.     }  
  31.       
  32.     public static void main(String[] args){  
  33.         Map<String, Integer> map = new HashMap<String, Integer>();  
  34.         String key = null;  
  35.         for(int i = 0; i < 1000; i++){  
  36.             key = selectServer(servers);  
  37.             if(map.containsKey(key)){  
  38.                 map.put(key, map.get(key) + 1);  
  39.             }else{  
  40.                 map.put(key, 1);  
  41.             }  
  42.         }  
  43.         for(String key1 : map.keySet()){  
  44.             System.out.println(key1 + " " + map.get(key1));  
  45.         }  
  46.     }  
  47.       
  48. }  

结果:

 

192.168.20.104 408
192.168.20.101 97
192.168.20.102 208
192.168.20.103 287


对服务器:192.168.20.101 192.168.20.102 192.168.20.103 192.168.20.104 

接近 1 2 3 4 的比率

猜你喜欢

转载自whxhz.iteye.com/blog/2324574