RocketMQ 之 instanceName (一)

611 阅读1分钟

1 定义

在apache rocketmq 的官方文档中, 暂时没有找到相关对instanceName的相关说明.

 在使用RocketMQ的过程中,大家 对instanceName或多或少都会有一些印象,只是大家在使用的时候并没有过多的注意到这个属性.

2 初探

  • 重要的类:  ClientConfig, MQClientInstance,MQClientManager

在上述截图中,我们发现如果我们没有设置instanceName,那么系统也会给一个默认值DEFAULT.

我们先重点看一下ClientConfig里有哪些重要的方法,以及各版本见的差异.

/*
* 把instanceName 变更成pid, 4.9.0 及以上版本
* 如果我们没有设置instanceName字段,那么instanceName就会被设置成进程ID+当前时间戳
*/
public void changeInstanceNameToPID(){
    if (this.instanceName.equals("DEFAULT")) {   
         this.instanceName = UtilAll.getPid() + "#" + System.nanoTime();
    }
}

/*
* 把instanceName 变更成pid, 4.9.0 以下版本
* 如果我们没有设置instanceName字段,那么instanceName就会被设置成进程ID
*/
public void changeInstanceNameToPID(){
    if (this.instanceName.equals("DEFAULT")) {   
         this.instanceName = String.valueOf(UtilAll.getPid());
    }
}

 在这里,为什么从4.9.0版本开始,要加上当前时间戳呢? 加这个是为了解决什么问题呢?  这个留到后续我们再说.

我们再看另一个重要的方法. ClientConfig类里的

/**
* 构建mqClientId clientIp+ instanceName + unitName
* 如果用不到RocketMq Streams, 其实
*/
public String buildMQClientId() {  
    StringBuilder sb = new StringBuilder();    
    sb.append(this.getClientIP());    
    sb.append("@");    
    sb.append(this.getInstanceName());   
    if (!UtilAll.isBlank(this.unitName)) {    
        sb.append("@");      
        sb.append(this.unitName);   
    }    
    return sb.toString();
}

上面介绍的这些关键的类以及代码片段,是为了下一章的内容做铺垫.