NSQ系列之nsqlookupd代码分析一(初探nsqlookup)

NSQ系列之nsqlookupd代码分析一(初探nsqlookup)

nsqlookupd 是守护进程负责管理拓扑信息。客户端通过查询 nsqlookupd 来发现指定话题(topic)的生产者,并且提供 nsqd 节点广播话题(topic)和通道(channel)信息。

nsqlookupd 有两个接口:TCP 接口,nsqd 用它来广播。HTTP 接口,客户端用它来发现和管理。

本系列的代码分析均是基于nsq v0.3.5的代码进行的分析,如有不对之处欢迎大家指正指导。

nsqlookup struct分析

代码文件路径为nsq/nsqlookupd/nsqlookupd.go

type NSQLookupd struct {
    sync.RWMutex               //读写锁
    opts         *Options  //nsqlookupd 配置信息 定义文件路径为nsq/nsqlookupd/options.go
    tcpListener  net.Listener
    httpListener net.Listener
    waitGroup    util.WaitGroupWrapper //WaitGroup 典型应用 用于开启两个goroutine,一个监听HTTP 一个监听TCP
    DB           *RegistrationDB //product 注册数据库 具体分析后面章节再讲
}

//初始化NSQLookupd实例
func New(opts Options) NSQLookupd {
    n := &NSQLookupd{
        opts: opts,
        DB:   NewRegistrationDB(), //初始化DB实例
    }
    n.logf(version.String("nsqlookupd"))
    return n
}

func (l *NSQLookupd) Main() {
    ctx := &Context{l} //初始化Context实例将NSQLookupd指针放入Context实例中 Context结构请参考文件nsq/nsqlookupd/context.go Context用于nsqlookupd中的tcpServer 和 httpServer中

    tcpListener, err := net.Listen("tcp", l.opts.TCPAddress) //开启TCP监听
    if err != nil {
        l.logf("FATAL: listen (%s) failed - %s", l.opts.TCPAddress, err)
        os.Exit(1)
    }
    l.Lock()
    l.tcpListener = tcpListener
    l.Unlock()
    tcpServer := &tcpServer{ctx: ctx} //创建一个tcpServer tcpServer 实现了nsq/internal/protocol包中的TCPHandler接口
    l.waitGroup.Wrap(func() {
            //protocol.TCPServer方法的过程就是tcpListener accept tcp的连接
            //然后通过tcpServer中的Handle分析报文,然后处理相关的协议
        protocol.TCPServer(tcpListener, tcpServer, l.opts.Logger)
    }) //把tcpServer加入到waitGroup

    httpListener, err := net.Listen("tcp", l.opts.HTTPAddress) //开启HTTP监听
    if err != nil {
        l.logf("FATAL: listen (%s) failed - %s", l.opts.HTTPAddress, err)
        os.Exit(1)
    }
    l.Lock()
    l.httpListener = httpListener
    l.Unlock()
    httpServer := newHTTPServer(ctx) //创建一个httpServer
    l.waitGroup.Wrap(func() {
        http_api.Serve(httpListener, httpServer, "HTTP", l.opts.Logger)
    }) //把httpServer加入到waitGroup
}

//NSQLookupd退出
func (l *NSQLookupd) Exit() {
    if l.tcpListener != nil {
        l.tcpListener.Close() //关闭tcpListener
    }

    if l.httpListener != nil {
        l.httpListener.Close() //关闭httpListener
    }
    l.waitGroup.Wait()
}

这一章节的代码就先分析到这里了,下一章节要分析的是nsqlookup中的tcpServer.

文章转载自 开源中国社区[https://www.oschina.net]

时间: 2024-08-08 16:19:11

NSQ系列之nsqlookupd代码分析一(初探nsqlookup)的相关文章

破解索尼PS4系列:用户代码执行(二)

本文讲的是破解索尼PS4系列:用户代码执行(二), 本文会重点讲解如何在WebKit进程中进行代码执行. 代码执行 正如上一篇文章讲过的那样,ROP只是以一种聪明的方式执行内存中加载的现有代码,而ROP在技术上完全可以实现图灵完备(Turing complete),不过对于一些基本测试,ROP链反而显得有点复杂,让人感觉不太实用. 不过现在,我们已经能够利用ROP来设置内存,这样我们就可以将自己的代码写进去并执行它. 简而言之,这意味着我们可以编译C代码,例如PS4-SDK中包含的这些样本,并将

自定义View系列教程05--示例分析

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View

SDL2.0例子代码分析-----CheckKeys Project

SDL简介 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成.SDL提供了数种控制图像.声音.输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux.Windows.Mac OS X等)的应用软件.目前SDL多用于开发游戏.模拟器.媒体播放器等多媒体应用领域. SDL1.2和SDL2的差别 SDK1.2和SDL2.1系列的API接口变动的不小,当然功能也大大增强,支持多线程窗口. 具体的change 请看 h

C++反汇编代码分析–函数调用

转载:http://shitouer.cn/2010/06/method-called/ 代码如下:#include "stdlib.h" int sum(int a,int b,int m,int n){ return a+b; } void main(){ int result = sum(1,2,3,4); system("pause"); } 有四个参数的sum函数,接着在main方法中调用sum函数.在debug环境下,单步调试如下: 11:   void

tensorflow笔记:多层LSTM代码分析

标签(空格分隔): tensorflow笔记 tensorflow笔记系列:  (一) tensorflow笔记:流程,概念和简单代码注释  (二) tensorflow笔记:多层CNN代码分析  (三) tensorflow笔记:多层LSTM代码分析  (四) tensorflow笔记:常用函数说明  (五) tensorflow笔记:模型的保存与训练过程可视化  (六)tensorflow笔记:使用tf来实现word2vec 之前讲过了tensorflow中CNN的示例代码,现在我们来看RN

Alipay UED推出网站代码分析插件:Monster

Monster 是 Alipay UED 推出的网站代码分析.质量检测及评分的浏览器扩展,它能智能分析CSS.JS.HTML内容并生动形象展示网页得分情况(类似YSlow).它是一个开源项目,您可以在GoogleCode中心检出MonsterForChrome项目源代码.不久会推出Firefox版扩展. Monster主要检测规则: 检测是否有重复ID的标签: 检测是否使用内联标签嵌套块级标签,如a嵌套div: 检测https协议页面,是否使用了http协议的图片.JS.CSS等: 检测comp

Javascript日期级联组件代码分析及demo

最近研究下JS日期级联效果 感觉还不错,然后看了下kissy也正好有这么一个 组件,也看了下源码,写的还不错,通过google最早是在2011年 淘宝的虎牙(花 名)用原审JS写了一个(貌似据说是从YUI那边重构下的) 具体的可以看他的 博 客园 , 感觉kissy组件源码 思路也是和YUI类似 所以我今天的基本思路也和他们 的一样 只是通过自己分析下及用自己的方式包装下. 基本原理 1.传参中有 '年份下拉框dom节点', '月份下拉框dom节点', '天数下拉框dom 节点', "开始日期&

C语言中的数组和指针汇编代码分析实例

  这篇文章主要介绍了C语言中的数组和指针汇编代码分析实例,本文用一则C语言例子来得到对应的汇编代码,并一一注解每句汇编代码的含义,需要的朋友可以参考下 今天看<程序员面试宝典>时偶然看到讲数组和指针的存取效率,闲着无聊,就自己写了段小代码,简单分析一下C语言背后的汇编,可能很多人只注重C语言,但在实际应用当中,当出现问题时,有时候还是通过分析汇编代码能够解决问题.本文只是为初学者,大牛可以飘过~ C源代码如下: 代码如下: #include "stdafx.h" int

传智播客c/c++公开课学习笔记--C语言与木马恶意代码分析和360安全防护揭秘

黑客代码分析与预防 笔记 [课程简介] C/C++语言是除了汇编之外,最接近底层的计算机语言,目前windows,linux,iOS,Android等主流操作系统都是用C/C++编写的,所以很多病毒.木马也都是用C/C++实现的.课程的目的就是通过C语言揭秘木马和各种远程控制软件的实现原理以及如何防护.  [课程知识点] 1.木马入侵系统的方式: 2.木马入侵到宿主目标后的关键行为分析: 3.可信任端口以及端口扫描技术: 4.远程控制的实现代码实现: 5.恶意代码中使用TCP.UDP协议与防火墙