美文网首页
负载均衡指定权重-加权随机数

负载均衡指定权重-加权随机数

作者: 王小杰at2019 | 来源:发表于2019-02-10 14:02 被阅读11次

    加权随机数

    加权随机数一般用于资源调度场景,比如说在服务部署的时候每台机器的性能不一样那么我们就不能用平均负载,如果使用评价负载容量小的机器肯定承受不住,那么我们就需要指定权重例如例如 nginx 中的

    upstream debugo_servers {
        server debugo03:80 weight=5;
        serv7er debugo04:80 weight=10;
    }
    

    这个是nginx给定的,有时候我们需要自己实现这个功能那么就可以用下面的代码了

    public class WeightRandom {  
          
        public static Map<String, Integer> servers = new HashMap<String, Integer>();  
      
        static{  
            servers.put("192.168.20.101", 1);  
            servers.put("192.168.20.102", 2);  
            servers.put("192.168.20.103", 3);  
            servers.put("192.168.20.104", 4);  
        }  
          
        public static String selectServer(Map<String, Integer> servers){  
            if(servers == null || servers.size() == 0) return null;  
              
            Integer sum = 0;  
            Set<Map.Entry<String, Integer>> entrySet = servers.entrySet();  
            Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();  
            while(iterator.hasNext()){  
                sum += iterator.next().getValue();  
            }  
            Integer rand =(int)(Math.random()* sum) + 1;
    
            for(Map.Entry<String, Integer> entry : entrySet){  
                rand -= entry.getValue();  
                if(rand <=0){  
                    return entry.getKey();  
                }  
            }  
              
            return null;  
        }  
          
        public static void main(String[] args){  
            Map<String, Integer> map = new HashMap<String, Integer>();  
            String key = null;  
            for(int i = 0; i < 1000; i++){  
                key = selectServer(servers);  
                if(map.containsKey(key)){  
                    map.put(key, map.get(key) + 1);  
                }else{  
                    map.put(key, 1);  
                }  
            }  
            for(String key1 : map.keySet()){  
                System.out.println(key1 + " " + map.get(key1));  
            }  
        }  
          
    }  
    

    运行结果

    根据运行结果我们可以看到 101大概在100 左右,102 大概在200左右 103 大概在300左右,104 大概在400左右, 我们循环的次数越多偏离的就越少,随机数没有绝对的

    192.168.20.104 423
    192.168.20.101 93
    192.168.20.103 304
    192.168.20.102 180
    

    相关文章

      网友评论

          本文标题:负载均衡指定权重-加权随机数

          本文链接:https://www.haomeiwen.com/subject/ppzteqtx.html