im
im copied to clipboard
关于随机的方式选择服务器节点的疑问
hi,master分支下面的随机选择节点有点疑问请教一下:
protected ServerNode doSelect(List<ServerNode> serverNodes) {
int size = serverNodes.size();
int[] weights = new int[size];
int total = 0 ;
for(int i=0;i<size;i++){
Integer weight = serverNodes.get(i).getWeight();
total+=weight;
weights[i] = total;
}
//类似于抽奖算法
int randomIndex = ThreadLocalRandom.current().nextInt(weights[size - 1]);
for(int index = 0;index<size;index++){
if(randomIndex < weights[index]){
return serverNodes.get(index);
}
}
return serverNodes.get(ThreadLocalRandom.current().nextInt(serverNodes.size()));
}
0客户端的时候启动2个服务节点,此时2个服务节点的权重weight是不是都是0? 如果是的话
int randomIndex = ThreadLocalRandom.current().nextInt(weights[size - 1]);
这个里面的nextInt一直时0,会报错吧?
确实有这个问题,当时自己写的也比较随意。有兴趣的话可以研究下dubbo的负载均衡策略
服务间,断线重连接后,无法转发数据
看了你这个源代码,感觉好几处都是断层的: 1.当服务器注册到zk后,通过服务端的zk客户端监听有新的服务进入,则作为客户端和对应新加入的服务端节点通讯,一旦连接成功后,这个时候就只单单发送一个ServerPeerConnectedMessage 就没下文? 2.ChatRedirectHandler 处理请求来的消息 查找到有对应的to 用户即有对应session 然后就只有: boolean result = serverSession.writeAndFlush(chatRequestMessage);
到这里直接就行?