负载均衡-加权随机算法

负载均衡-加权随机算法

        由于访问概率大致相同,所以如果部分服务器性能不一致的话,容易导致性能差的服务器压力过大,所以要根据服务器性能不一致的情况,给性能好的服务器多处理请求,给差的少分配请求(能者多劳)所以就需要在随机算法的基础上给每台服务器设置权重,延伸为加权随机算法

  • 1、将应用服务器集群的IP存到Map里,每个IP对应有一个权重
  • 2、创建一个List,来将所有权重下的IP存到list里面 如:192.168.1.100 权重为3,则需要加入3个IP,192.168.1.102权重为4,则需要加入4个IP
  • 3、在0~所有权重之和的范围中选出一个随机数,这个随机数对应List的位置即是当前选取出来的IP地址
  • 4、在调用量越大的情况下,每台服务器的流量分配处理概率越均衡(性能好的能分配较多的流量)
  • package nginx;
    
    import java.util.*;
    
    /**
     * 负载均衡
     * 加权随机算法
     * <P>由于访问概率大致相同,所以如果部分服务器性能不一致的话,容易导致性能差的服务器压力过大,所以要根据服务器性能不一致的情况,给性能好的服务器多处理请求,给差的少分配请求(能者多劳)所以就需要在随机算法的基础上给每台服务器设置权重,延伸为加权随机算法</P>
     *
     * <li>1、将应用服务器集群的IP存到Map里,每个IP对应有一个权重</li>
     * <li>2、创建一个List,来将所有权重下的IP存到list里面 如:192.168.1.100 权重为3,则需要加入3个IP,192.168.1.102权重为4,则需要加入4个IP </li>
     * <li>3、在0~所有权重之和的范围中选出一个随机数,这个随机数对应List的位置即是当前选取出来的IP地址 </li>
     * <li>4、在调用量越大的情况下,每台服务器的流量分配处理概率越均衡(性能好的能分配较多的流量)</li>
     *
     * @author Administrator
     */
    public class RandomJava {
        /**
         * 服务器列表<服务器地址,权重>
         */
        public static Map<String, Integer> map = new HashMap<String, Integer>() {
            {
                put("192.168.1.100", 3);
                put("192.168.1.102", 4);
                put("192.168.1.103", 5);
            }
        };
        static Random random = new Random();
    
        /**
         * 获取IP
         * @return
         */
        public static String getServer() {
            List<String> ipList = new ArrayList<String>();
            for (Map.Entry<String, Integer> item : map.entrySet()) {
                //将每个权重W 下的IP添加 W次,来满足随机权重
                for (int i = 0; i < item.getValue(); i++) {
                    ipList.add(item.getKey());
                }
            }
            //当前服务器IP地址的权重之和
            int allWeight = map.values().stream().mapToInt(a -> a).sum();
            System.out.println(allWeight + "");
            //随机选取一个IP
            int number = random.nextInt(allWeight);
            System.out.println(Arrays.toString(ipList.toArray()));
            return ipList.get(number);
        }
    
        public static void main(String[] args) {
            //三台服务器IP的调用概率
            double a = 0, b = 0, c = 0;
            int size = 100000;
            String ip = "";
            for (int i = 0; i < size; i++) {
                ip = getServer();
                if (ip.equals("192.168.1.100")) {
                    a++;
                }
                if (ip.equals("192.168.1.102")) {
                    b++;
                }
                if (ip.equals("192.168.1.103")) {
                    c++;
                }
            }
             System.out.println(a / size + "\n" + b / size + "\n" + c / size + "");
        }
    
    }
    
    
    权重之和:12
    List: [192.168.1.103, 192.168.1.103, 192.168.1.103, 192.168.1.103, 192.168.1.103, 192.168.1.100, 192.168.1.100, 192.168.1.100, 192.168.1.102, 192.168.1.102, 192.168.1.102, 192.168.1.102]
    
    概率:
    0.25059
    0.33183
    0.41758
    

    猜你喜欢

    转载自blog.csdn.net/weixin_41367523/article/details/106476049