1. Namesrv 简介
Namesrv 可以领略为一个注册中心, 整个Namesrv的代码很是简朴,主要包括两块成果:
昆山软件开拓 地点列表是怎么来的呢" title="600" src="http://www.importnew.com/https:/fdx321.github.io/images/%E3%80%90RocketMQ%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E3%80%912-Namesrv_1.png" />
2. Namesrv 启动进程
启动进程主要涉及 NamesrvStartup/NamesrvController 两个类, NamesrvStartup 认真理会呼吁行的一些参数到各类 Config 工具中(NamesrvConfig/NettyServerConfig等),假如呼吁行参数中带有设置文件的路径,也会从设置文件中读取设置到各类 Config 工具中,然后初始化 NamesrvController,设置shutdownHook, 启动 NamesrvController。 NamesrvController 会去初始化和启动各个组件,主要是:
不只仅 Namesrv 是这样,劳务派遣管理系统,其他模块在启动进程中也都是 startup/controller/config 一起完成这样的套路。
3. Namesrv 主要组件
HashMap<Integer/* request code */, Pair<NettyRequestProcessor, ExecutorService>> processorTable
一个 processor 可以处理惩罚多个 request code, 多个 processor 也可以共用一个线程池。对付 Namesrv, 只有一个 processor 线程池,给两个 Processor 共享。
4. 以broker注册为例看下Namesrv的事情进程
{ "topicConfigSerializeWrapper": { "topicConfigTable":{ "topic_xxx":{ "defaultReadQueueNums":"16", "defaultWriteQueueNums":"16", "topicName":"xxx", "readQueueNums":"", "writeQueueNums":"", "perm":"", "topicFilterType":"", "topicSysFlag":"", "order":"" }, }, "dataVersion":{ "timestamp":"xxxx", "counter":"xxxx" } }, "filterServerList":[ "",//filterServerAddr ] }
{ "cluster":"xxx", "brokerName":"xxx", "brokerAddrs":{ "brokerId_xx":"broker address xxx" } }
5.其他
以上内容看下来,namesrv 是一个无状态的应用,可以程度任意扩展。每一个 broker 城市和所有的 namesrv 保持长毗连(有个scheduled task会按必然频率给所有namesrv做register broker的操纵),所以 namesrv 之间没有主从干系,也不需要复制数据。client(producer/consumer) 随机选一个 namesrv 毗连。client 中的 namesrv 地点列表是怎么来的呢,有两种方法:
if (addrList != null && !addrList.isEmpty()) { for (int i = 0; i < addrList.size(); i++) { int index = this.namesrvIndex.incrementAndGet(); index = Math.abs(index); index = index % addrList.size(); String newAddr = addrList.get(index); this.namesrvAddrChoosed.set(newAddr); Channel channelNew = this.createChannel(newAddr); if (channelNew != null) return channelNew; } }
看到这里我发生了疑问,那岂不是每个 client 启动的时候都取的是第一个 namesrv,它不会压力很大吗,厥后发明 namesrvIndex 的初始值是随机的。
以上所有扯淡都是基于源码 https://github.com/apache/incubator-rocketmq (tag:rocketmq-all-4.1.0-incubating)所贴代码有所删减。