im icon indicating copy to clipboard operation
im copied to clipboard

关于随机的方式选择服务器节点的疑问

Open YeFei572 opened this issue 3 years ago • 3 comments

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,会报错吧?

YeFei572 avatar Sep 15 '22 14:09 YeFei572

确实有这个问题,当时自己写的也比较随意。有兴趣的话可以研究下dubbo的负载均衡策略

beardlessCat avatar Sep 17 '22 07:09 beardlessCat

服务间,断线重连接后,无法转发数据

windynet avatar Oct 26 '22 03:10 windynet

看了你这个源代码,感觉好几处都是断层的: 1.当服务器注册到zk后,通过服务端的zk客户端监听有新的服务进入,则作为客户端和对应新加入的服务端节点通讯,一旦连接成功后,这个时候就只单单发送一个ServerPeerConnectedMessage 就没下文? 2.ChatRedirectHandler 处理请求来的消息 查找到有对应的to 用户即有对应session 然后就只有: boolean result = serverSession.writeAndFlush(chatRequestMessage);

到这里直接就行?

yeshucheng avatar Dec 18 '23 14:12 yeshucheng