配置解析

nsqd的主函数位于apps/nsqd.go中的main函数

首先main函数调用nsqFlagsetParse进行命令行参数集初始化, 
然后判断version参数是否存在,若存在,则打印版本号并退出程序

接下来钩住系统的syscall.SIGINTsyscall.SIGTERM消息,用来阻塞主goroutine防止退出

随后判断config参数是否存在,若存在的话还需进行配置文件的读取, 
nsq使用toml格式的配置文件,并通过github.com/BurntSushi/toml库进行配置文件的读取和解析

如果配置文件存在并且符合toml格式,则调用cfg.Validate对配置文件的各项进行进一步的合法性检查。 
主要是检查配置文件中有关tls的选项(是否支持以及支持的版本)

配置文件检查通过后,创建默认配置opts,并于命令行参数和配置文件进行合并。 
合并时用到了github.com/mreiferson/go-options库。 
若出现冲突,则优先级从高到低排序依次是命令行、配置文件和默认配置 
使用合并后的参数集初始化真正的nsqd对象

最后,nsqd对象进行初始化和检查后,启动nsqd包的主函数,程序从跳转apps/nsqd.gonsqd/nsqd.go

初始化

nsqd真正开始运行前需要执行nsqd/nsqd.go中的LoadMetadataPersistMetadata两个函数

LoadMetadata

初始化nsqd的LoadMetadata函数使用atomic包中的方法来保证方法执行前和执行后isLoading值的改变

元数据以json格式保存在nsqd可执行文件目录下的nsqd.%d.dat中。其中%d为代表该程序的ID, 
通过在启动时的命令行worker-id或者配置文件中的id指定。默认ID是通过对主机名散列后获得。 
因此保证了同一台机器每次启动的ID相同。

解析元数据的文件得到系统中的存在的topic列表,遍历topic列表中的每个topic:

  1. 检查topic名称是否合法(长度在1-64之间,满足正则表达式^[\.a-zA-Z0-9_-]+(#ephemeral)?$) 
    ,若不合法则忽略
  2. 使用GetTopic函数通过名字获得topic对象
  3. 判断当前topic对象是否处于暂停状态,是的话调用Pause函数暂停topic
  4. 获取当前topic下所有的channel,并且遍历channel,执行的操作与topic基本一致 
    1. 检查channel名称是否合法(长度在1-64之间,满足正则表达式^[\.a-zA-Z0-9_-]+(#ephemeral)?$) 
      ,若不合法则忽略
    2. 使用GetChannel函数通过名字获得channel对象
    3. 判断当前channel对象是否处于暂停状态,是的话调用Pause函数暂停channel

至此,元数据的载入完成

PersistMetadata

PersistMetadata将当前的topic和channel信息写入nsqd.%d.dat文件中, 
主要步骤是忽略#ephemeral结尾的topic和channel后将topic和channel列表json序列化后写回文件中

写入文件时先创建扩展名为tmp的临时文件,写入内容后并保存后再调用atomicRename函数将tmp文件重命名为nsqd.%d.dat。 
其中atomicRename函数在windows和其他操作系统下实现方式不同,分别位于nsqd/rename_windows.go 
rename.go中。在Linux下直接调用了os.Rename函数,而Windows下则使用Win32 API实现了文件的重命名。 
这是因为go的早期版本中Windows下调用os.Rename函数时如果重命名后的文件已经存在则会失败。 
这个bug在os: make Rename atomic on Windows中提到, 
并且已经在os: windows Rename should overwrite destination file.提交中被修复, 
因此,Golang1.5不存在这一bug

Main

Main函数中,nsqd真正开始运行。Main监听tcp,https(如果设置了相关参数),http端口并通过WaitGroupWrapperWrap函数以goroutine方式启动主要的组件。

其中WaitGroupWrapper是对sync.WaitGroup的简单包装

执行完Main函数后,配置和初始化工作全部完成,各个组件启动运行,而主goroutine会阻塞在<-signalChan处,直到收到中断程序的信号,随后执行nsqd.Exit函数。 
Exit函数将进行socket关闭等清理工作,随后结束整个程序的运行。

nsq源码阅读笔记之nsqd(一)——nsqd的配置解析和初始化的更多相关文章

  1. nsq源码阅读笔记之nsqd(二)——Topic

    与Topic相关的代码主要位于nsqd/nsqd.go, nsqd/topic.go中. Topic的获取 Topic通过GetTopic函数获取 GetTopic函数用于获取topic对象,首先先尝 ...

  2. nsq源码阅读笔记之nsqd(四)——Channel

    与Channel相关的代码主要位于nsqd/channel.go, nsqd/nsqd.go中. Channel与Topic的关系 Channel是消费者订阅特定Topic的一种抽象.对于发往Topi ...

  3. nsq源码阅读笔记之nsqd(三)——diskQueue

    diskQueue是backendQueue接口的一个实现.backendQueue的作用是在实现在内存go channel缓冲区满的情况下对消息的处理的对象. 除了diskQueue外还有dummy ...

  4. CI框架源码阅读笔记5 基准测试 BenchMark.php

    上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功 ...

  5. CI框架源码阅读笔记4 引导文件CodeIgniter.php

    到了这里,终于进入CI框架的核心了.既然是“引导”文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.c ...

  6. CI框架源码阅读笔记3 全局函数Common.php

    从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap ...

  7. CI框架源码阅读笔记2 一切的入口 index.php

    上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中, ...

  8. 源码阅读笔记 - 1 MSVC2015中的std::sort

    大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...

  9. Three.js源码阅读笔记-5

    Core::Ray 该类用来表示空间中的“射线”,主要用来进行碰撞检测. THREE.Ray = function ( origin, direction ) { this.origin = ( or ...

随机推荐

  1. C++——虚函数问题小集

    学习C++ 不可避免地会遇到虚函数的问题,下面几个问题在学习初期或多或少会存在一些疑惑,所以便将其总结了下来. 1.为什么静态成员函数.构造函数不能定义为虚函数? 因为静态成员函数是一个大家共享的一个 ...

  2. ionic3-ng4学习见闻--(轮播图完美方案)

    ionic上 轮播图是最坑的插件了吧,各种bug和 问题. 事件也不好用.. 于是,我终于搞出来了一个完美的方案, 适用于,动态获取轮播图数据,自动循环播放,跳转其他页面回来后自动播放,手指触摸后自动 ...

  3. Html5深受欢迎的理由

    一.世界知名浏览器厂商对Html5的支持 微软:2010年微软称完成Ie9的开发后,讲更对支持css3.svg和html5等互联网浏览通用标准. Google:2010年谷歌重点开发html5项目. ...

  4. azkaban报错记录

    问题信息:Failed to build job executor for job o2o_get_file_ftp1Job type 'command ' is unrecognized. Coul ...

  5. 服务器禁止ping

    禁止ping后,不让别人通过域名ping到你的ip, 如果禁用后,你在ping自己的域名会给你返回服务商的IP并提示超时, 这样你就可以减少IP暴露,增加一点安全. 禁止方法: 编辑 /etc/sys ...

  6. Ubuntu16.04下安装Hadoop

    一.记录理由 刚开始只是想要学习怎么使用Hive的.想着安装应该很简单,没想到花了整整一天的时间来安装,为了避免下次犯同样的错误,特此记录. 二.安装Hadoop 网上教你怎么安装Hadoop的文章有 ...

  7. Zookeeper + Dubbo + SpringMVC + dubbo-admin

    第一步:在CentOS/Windows上安装Zookeeper[前提] A:CentOS     Zookeeper作为Dubbo服务的注册中心,Dubbo原先基于数据库的注册中心,没采用Zookee ...

  8. Nginx+uwsgi部署django

    0. 登录远程服务器并准备 ssh 用户@IP -p 端口 回车后,要求输入服务器密码,再输入密码 更新软件源 sudo apt-get update sudo apt-get upgrade 1. ...

  9. 通过jdbc完成单表的curd操作以及对JDBCUtils的封装

    概述:jdbc是oracle公司制定的一套规范(一套接口),驱动是jdbc的实现类,由数据库厂商提供.所以我们可以通过一套规范实现对不同的数据库操作(多态) jdbc的作用:连接数据库,发送sql语句 ...

  10. WordPress调用特色图片地址源,去除特色图片img标签其他样式

    我们在制作WordPress主题时候想要给wordpress特色图片,这也是为了更加的美观,但是我们直接使用wordpress特色图片引用代码的时候却发现,出现下面的情况. wordpress特色图片 ...