心跳检测在集群架构下的设计原理及源码剖析
刚才分析一下心跳检测的代码,这里不得的不多说一句这里的一个细节设计,如果Nacos是集群的状态,并不是集群中的每节点机器都会检测所有的Instance的心跳,而是用算法来计算每个节点机器需要检测那些Instances,我们来看看源码中是如何计算的:
public boolean responsible(String serviceName) {
final List<String> servers = healthyList;
// 如果采用独立模式启动,直接返回true
if (!switchDomain.isDistroEnabled() || EnvUtil.getStandaloneMode()) {
return true;
}
if (CollectionUtils.isEmpty(servers)) {
// means distro config is not ready yet
return false;
}
// 获取当前Nacos Server节点在所有节点列表的第一个index
int index = servers.indexOf(EnvUtil.getLocalAddress());
// 获取当前Nacos Server节点在所有节点列表的最后个index
int lastIndex = servers.lastIndexOf(EnvUtil.getLocalAddress());
if (lastIndex < 0 || index < 0) {
return true;
}
// 把serviceName进行Hash操作,然后跟service size进行取模
// 如果取模后的结构在index和lastIndex之间,那么就返回true
int target = distroHash(serviceName) % servers.size();
return target >= index && target <= lastIndex;
}
大致的算法就是通过serviceName计算出一个Hash值然后跟Nacos集群中所有机器数量进行取模,得到的结果如果跟当前Nacos Server节点在集群List的index和lastIndex之间,那么就采用当前的Nacos Server节点进行心跳检测。
版权声明:本文为louis_zzz原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。