nsqd的启动代码入口在apps/nsqd/nsqd.go
apps/nsqd/nsqd.go
nsq使用svc包来控制nsqd守护进程的启停
type program struct {
nsqd *nsqd.NSQD
}
func main() {
prg := &program{}
if err := svc.Run(prg, syscall.SIGINT, syscall.SIGTERM); err != nil {
log.Fatal(err)
}
}
func (p *program) Init(env svc.Environment) error {...}
func (p *program) Start() error {...}
func (p *program) Stop() error {...}
svc包能让程序安全的推出,从代码中看出nsqd接收两个信号可退出:SIGINT(输入任意健) 和 SIGTERM(kill)。
重要逻辑均在Start()函数中,该函数主要做了三件事
- 接收命令行参数,根据参数创建nsqd结构
- 加载消息和持久化消息
- 调用nsqd.Main()启动
opts := nsqd.NewOptions()
该函数创建一个默认的nsqd参数
options.Resolve(opts, flagSet, cfg)
nsqd := nsqd.New(opts)
利用flag包读取命令行参数后,根据参数生成nsqd结构。
err := nsqd.LoadMetadata()
err = nsqd.PersistMetadata()
然后加载消息和持久化消息
nsqd.Main()
最后调用nsqd.Main()函数执行最重要的启动逻辑
网友评论