加权随机(Weight Random)法

与加权轮询法类似,加权随机法也根据后端服务器不同的配置和负载情况,配置不同的权重。不同的是,它是按照权重来随机选取服务器的,而非顺序

/**
     * 实现方法一
     */
    public static String testWeightRandom() {
        // 重新创建一个 map,避免出现由于服务器上线和下线导致的并发问题
        Map<String, Integer> serverMap = new HashMap<>();
        serverMap.putAll(serverWeightMap);

        // 取得 IP 地址 list
        Set<String> keySet = serverMap.keySet();
        Iterator<String> it = keySet.iterator();

        List<String> serverList = new ArrayList<>();

        while (it.hasNext()) {
            String server = it.next();
            Integer weight = serverMap.get(server);
            for (int i = 0; i < weight; i++) {
                serverList.add(server);
            }
        }

        Random random = new Random();
        int randomPos = random.nextInt(serverList.size());
        String server = serverList.get(randomPos);

        return server;
    }

    /**
     * 实现方法二
     */
    public static String testWeightRandom() {
        // 重新创建一个 map,避免出现由于服务器上线和下线导致的并发问题
        Map<String, Integer> serverMap = new HashMap<>();
        serverMap.putAll(serverWeightMap);

        // 计算权重和
        long weightSum = 0;
        for (String key : serverMap.keySet()) {
            weightSum += serverMap.get(key);
        }

        // 产生随机数
        long random = Math.round(Math.random() * weightSum);
        long weight = 0;
        for (String server : serverMap.keySet()) {
            weight += serverMap.get(server);
            if (weight >= random) {
                return server;
            }
        }

        return serverMap.keySet().iterator().next();
    }

results matching ""

    No results matching ""