golang-NSQ源码阅读 4-nsq_to_file源码解析-2 channel | KaiQ.Gu|KerwinKoo Blog

JerryXia 发表于 , 阅读 (0)

继续之前的main函数分析,来具体分析nsq-to-file的与nsq有关的各个功能的实现

指定channel

nsq-to-file的channel通过-channel="nsq_to_file"OPT指定,指定之后,需要将新的channel注册至nsq或loopupd。

opt中获取及指定默认channel:

1
channel     = flag.String("channel", "nsq_to_file", "nsq channel")

channel的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
func newConsumerFileLogger(topic string, cfg *nsq.Config) (*ConsumerFileLogger, error) {
f, err := NewFileLogger(*gzipEnabled, *gzipLevel, *filenameFormat, topic) //获取输出文件句柄f
if err != nil {
return nil, err
}

consumer, err := nsq.NewConsumer(topic, *channel, cfg) //注册consumer
if err != nil {
return nil, err
}

consumer.AddHandler(f)

log.Println("newConsumerFileLogger:", "nsqdTCPAddrs:", nsqdTCPAddrs, "lookupdHTTPAddrs:", lookupdHTTPAddrs)

err = consumer.ConnectToNSQDs(nsqdTCPAddrs) //连接至每个NSQD,参数nsqdTCPAddrs是[]string,内容量为0时不会返回nil
if err != nil {
log.Fatal(err)
}

err = consumer.ConnectToNSQLookupds(lookupdHTTPAddrs) //连接至每个NSQLookupd
if err != nil {
log.Fatal(err)
}

return &ConsumerFileLogger{
C: consumer,
F: f,
}, nil
}

channel的使用,仅用在注册消费者consumer, err := nsq.NewConsumer(topic, *channel, cfg)这么一处地方。

函数newConsumerFileLogger是main中最终要调用的主要函数,起提纲挈领作用,在main函数中,newConsumerFileLogger会根据Topic的数量来调用多次。