NSQD对象的Main()方法中有一段代码:
n.waitGroup.Wrap(func() { n.lookupLoop() })
启动一个goroutine,处理与nsqlookupd进程的交互。封装在nsqd/lookup.go中。
这个goroutine的主要功能有:
1、连接nsqlookupd服务,执行IDENTIFY操作;
2、将nsqd的Metadata中的topic、channel注册到nsqlookupd服务;
3、15秒心跳一次,对nsqlookupd执行一次PING操作;
4、新增或删除topic、channel时,REGISTER或UNREGISTER到nsqlookupd服务。
首先连接nsqlookupd服务,连接到配置文件中nsqlookupd_tcp_addresses和命令行参数中“-lookupd-tcp-address”给定的nsqlookupd服务。
if connect {
// 配置文件中或启动命令中指定的nsqlookupd服务的地址
for _, host := range n.getOpts().NSQLookupdTCPAddresses {
// 如果已经连接过了,跳过
if in(host, lookupAddrs) {
continue
}
n.logf("LOOKUP(%s): adding peer", host)
lookupPeer := newLookupPeer(host, n.getOpts().MaxBodySize, n.getOpts().Logger,
connectCallback(n, hostname, syncTopicChan))
// 开始链接lookupd服务
lookupPeer.Command(nil) // start the connection
lookupPeers = append(lookupPeers, lookupPeer)
lookupAddrs = append(lookupAddrs, host)
}
// 赋值给n.lookupPeers
n.lookupPeers.Store(lookupPeers)
connect = false
}
初始化时,connect默认为true,会执行这段代码,连接到nsqlookupd服务,执行IDENTIFY操作。newLookupPeer()时,使用了修饰器,关于golang的修饰器,可以看看阿里陈皓大神的博客。然后将connect设为false,避