配置解析

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关闭等清理工作,随后结束整个程序的运行。

转载于:https://www.cnblogs.com/zhangboyu/p/7457061.html

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

  1. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  2. 源码阅读笔记 BiLSTM+CRF做NER任务 流程图

    源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...

  3. 代码分析:NASM源码阅读笔记

    NASM源码阅读笔记 NASM(Netwide Assembler)的使用文档和代码间的注释相当齐全,这给阅读源码 提供了很大的方便.按作者的说法,这是一个模块化的,可重用的x86汇编器, 而且能够被 ...

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

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

  5. Yii源码阅读笔记 - 日志组件

    2015-03-09 一 By youngsterxyf 使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category); Yii: ...

  6. AQS源码阅读笔记(一)

    AQS源码阅读笔记 先看下这个类张非常重要的一个静态内部类Node.如下: static final class Node {//表示当前节点以共享模式等待锁static final Node SHA ...

  7. 【Flink】Flink 源码阅读笔记(20)- Flink 基于 Mailbox 的线程模型

    1.概述 转载:Flink 源码阅读笔记(20)- Flink 基于 Mailbox 的线程模型 相似文章:[Flink]Flink 基于 MailBox 实现的 StreamTask 线程模型 Fl ...

  8. 【Flink】Flink 源码阅读笔记(18)- Flink SQL 中的流和动态表

    1.概述 转载:Flink 源码阅读笔记(18)- Flink SQL 中的流和动态表

  9. 【Flink】Flink 源码阅读笔记(16)- Flink SQL 的元数据管理

    1.概述 转载:Flink 源码阅读笔记(16)- Flink SQL 的元数据管理 Flink 源码阅读笔记(17)- Flink SQL 中的时间属

最新文章

  1. 设计模式:单例模式之枚举
  2. ironpython使用opencv_连这些都不知道,就别说自己懂Python!
  3. HDU - 3338 Kakuro Extension(最大流+思维建边)
  4. 国内机床发展水平和现状
  5. linux(虚拟机中)与windows共享文件两种方法
  6. 导入开源的文件云存储平台-Seafile
  7. java局部内部类_Java 局部内部类、匿名内部类详解
  8. ArrayList 和 HaspMap 链式添加的实现
  9. Linux 下安装 Elasticsearch5.6.x 详细步骤以及踩坑解决方案
  10. 因打印日志而引发的故障
  11. 逆袭?或将掌舵万亿SaaS巨头的Taylor竟是“天选之人”
  12. 软件测试jmeter面试问题,jmeter 面试题剖析实战
  13. Sentinel Slot扩展实践-流控熔断预警实现
  14. js calendar / wannianli
  15. Ansible 自动化运维工具之inventory和常用模块介绍
  16. kotlin 中关键字 lateinit
  17. Linux:安装rvm
  18. ICO、STO、IEO
  19. HTML文本框样式大全
  20. 华亭一中2021年高考成绩查询,华亭一中2019高考又传佳讯!

热门文章

  1. Codepen 每日精选(2018-4-22)
  2. [转]COPY OR MOVE FILES AND FOLDERS USING OLE AUTOMATION
  3. df命令,du命令,磁盘分区
  4. DDOS学习笔记(《破坏之王-DDOS攻击与防范深度剖析》)
  5. 取得Servlet文件的絕對路徑;文件讀寫操作
  6. windows server 2003 r2 64位web服务器安装配置注意事项
  7. MySQL -> ES 数据同步 配置步骤
  8. TortoiseSVN Unable to connect to a repository at URL XXX
  9. Android studio 使用Cmake完成C/C++ 的使用以及生成so文件
  10. 解决:object_detection/protos/*.proto: Invalid argument.