go语言 nsq源码解读四 nsqlookupd源码options.go、context.go和wait_group_wrapper.go

本节会解读nsqlookupd.go文件中涉及到的其中三个文件:options.go、context.go和wait_group_wrapper.go。

options.go

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package nsqlookupd

import (
    "log"
    "os"
    "time"
)

type nsqlookupdOptions struct {
    Verbose bool `flag:"verbose"`   //是否开启啰嗦模式,开启后,会打很多LOG,一般在调试或定位问题时使用。

    TCPAddress       string `flag:"tcp-address"`    //TCP监听地址
    HTTPAddress      string `flag:"http-address"`   //HTTP监听地址
    BroadcastAddress string `flag:"broadcast-address"`  //这个lookup节点的对外地址

    //producer的交互超时时间,默认是5分钟。就是说,如果5分钟内nsqlookupd没有收到producer的PING(类似心跳包),则会认为producer已掉线。
    InactiveProducerTimeout time.Duration `flag:"inactive-producer-timeout"`
    //字面直译是墓碑时间
    //在nsqadmin的http界面中访问/tombstone_topic_producer URL时,nsqlookupd会给producer TombstoneLifetime长度的时间来注销
    //默认为45秒,在这45秒内,producer不会再被任何consumer通过nsqadmin的/lookup操作找到,同时producer还会进行删除topic等操作。
    //45秒之后,producer就会与nsqlookupd断开连接,同时通过nsqlookupd TCP连接中的UNREGISTER操作在数据记录中把该producer删除。
    TombstoneLifetime       time.Duration `flag:"tombstone-lifetime"`
}

//
//新建nsqlookupdOptions类型的变量的指针
//
func NewNSQLookupdOptions() *nsqlookupdOptions {
    //获取主机名
    hostname, err := os.Hostname()
    if err != nil {
        log.Fatal(err)
    }

    //返回nsqlookupdOptions类型的变量,并指定默认参数。
    return &nsqlookupdOptions{
        //TCP监听本机的4160端口
        TCPAddress:       "0.0.0.0:4160",
        
        //HTTP监听本机的4161端口
        
        HTTPAddress:      "0.0.0.0:4161",
        
        //主机名
        BroadcastAddress: hostname,

        //5分钟超时
        InactiveProducerTimeout: 300 * time.Second,
        
        //45秒
        TombstoneLifetime:       45 * time.Second,
    }
}

context.go

1
2
3
4
5
6
7
8
9
package nsqlookupd

//
//根据Context的命名,指环境、上下文的意思。通俗来讲,就是保存一些运行环境的信息
//从下面的定义可以看出,Context只是包含了NSQLookupd的指针
//
type Context struct {
    nsqlookupd *NSQLookupd
}

wait_group_wrapper.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package util

import (
    "sync"
)

//
//本文件是对WaitGroup的封装,关于WaitGroup,根据字义,wait是等待的意思,group是组、团体的意思,合起来就是指等待一个组。
//即指,当一个组里所有的操作都完成后,才会继续执行。
//可以参考http://www.baiyuxiong.com/?p=913理解WaitGroup用法
//

type WaitGroupWrapper struct {
    sync.WaitGroup
}

func (*WaitGroupWrapper) Wrap(cb func()) {
    w.Add(1)
    go func() {
        cb()
        w.Done()
    }()
}

原文地址:https://www.cnblogs.com/zhangboyu/p/7456953.html