负载均衡轮询算法实现疑问

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/* 模拟实现:负载均衡的轮询算法 */
public class RoundRobin {

    public static void main(String[] args) {
        Map<String, Integer> serverWeightMap = new HashMap<String, Integer>();
        serverWeightMap.put("192.168.0.1", 1);
        serverWeightMap.put("192.168.0.2", 2);
        serverWeightMap.put("192.168.0.3", 1);
        serverWeightMap.put("192.168.0.4", 4);
        serverWeightMap.put("192.168.0.5", 3);
        serverWeightMap.put("192.168.0.6", 1);

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

        Set<String> keySet = serverMap.keySet();
        ArrayList<String> keyList = new ArrayList<String>();
        keyList.addAll(keySet);

        /* 定义了轮询位置 */
        Integer POS = 2;
        String currentServer;
        synchronized (POS) {
            if (POS > keyList.size()) {
                POS = 0;
            }
            currentServer = keyList.get(POS++);
        }
        System.out.println("current server is : " + currentServer);
    }
}

上述代码模拟实现了负载均衡中的轮询算法,但是代码中有这么一段不是很懂。为什么另外还要搞一个map呢?而且就算这样,假如serverWeightMap中有服务器宕机,虽然采用了putAll的复制措施,但是这样可能导致的情况就是,轮询后的server可能是不可用的,因为服务器宕机更新的map,并不是现在的map结构。

/* 重新创建一个Map,避免由于服务器上线和下线导致的并发问题 */
        Map<String, Integer> serverMap = new HashMap<String, Integer>();
        serverMap.putAll(serverWeightMap);
阅读 5k
1 个回答

看上去没有检测服务器是否在线的代码,所以用两个map没啥用,而且那个wight的integer也没有用到,这个代码没写完吧。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题