Nacos(1.4.2)注册中心原理及源码系列(六)- 心跳检测在集群架构下的设计原理及源码剖析

  • Post author:
  • Post category:其他


心跳检测在集群架构下的设计原理及源码剖析

刚才分析一下心跳检测的代码,这里不得的不多说一句这里的一个细节设计,如果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 版权协议,转载请附上原文出处链接和本声明。