负载均衡策略之随机策略

随机策略:在可用服务中,随机找一个,如果随机找到的server为null或者不可用,就会while不停的循环选取,直到选取可用的server

源码分析:

public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        } else {
            Server server = null;
            
            while(server == null) {
                if (Thread.interrupted()) {
                    return null;
                }
                
                // 获取可用服务集合
                List<Server> upList = lb.getReachableServers();
                // 获取所有服务集合
                List<Server> allList = lb.getAllServers();
                // 所有服务数
                int serverCount = allList.size();
                // 如果没有服务,那么直接返回null
                if (serverCount == 0) {
                    return null;
                }
                // 随机选取一个下标
                int index = this.chooseRandomInt(serverCount);
                // 根据下标在可用服务集合中选取一个服务
                server = (Server)upList.get(index);
                // 如果该服务为空,那么就重新选取
                if (server == null) {
                    Thread.yield();
                } else {
                    // 如果该服务是存活的,那么直接返回,否则重新选取
                    if (server.isAlive()) {
                        return server;
                    }
                    // 重新选取
                    server = null;
                    Thread.yield();
                }
            }
            
            return server;
        }
    }

在读取源码时,遇到的两个疑问:

疑问1:

在选取服务时,生成随机索引,为什么不直接拿可用服务总数生成随机数index,而是拿总服务数生成随机数index,再用这个index下标在可用服务集合中拿去服务。

疑问2:

该疑问是在1的基础上衍生出的,可用服务总数小于总服务数时,拿总服务数生成随机数index可能大于可用服务总数,这时使用get方法会报错,但是在源码这块没有进行抛出异常处理。

有大佬能否解答一下!感谢!

posted @ 2022-10-22 17:29  码到成功hy  阅读(77)  评论(0编辑  收藏  举报
获取

hahah

name age option