负载均衡策略之随机策略
随机策略:在可用服务中,随机找一个,如果随机找到的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方法会报错,但是在源码这块没有进行抛出异常处理。
有大佬能否解答一下!感谢!