文档章节

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

大蓝妹
 大蓝妹
发布于 2015/08/27 23:54
字数 594
阅读 1676
收藏 22
点赞 1
评论 0

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.

第二章传送门 NSQ系列之nsqlookupd代码分析二(初识nsqlookupd tcpServer)

© 著作权归作者所有

共有 人打赏支持
大蓝妹
粉丝 13
博文 11
码字总数 4929
作品 1
其他
人事招聘
NSQ系列之nsqlookupd代码分析四(详解nsqlookupd中的RegitrationDB)

NSQ系列之nsqlookupd代码分析四(详解nsqlookupd中的RegitrationDB操作方法) 上一章我们大致了解了的中的协议的处理逻辑,里面有提到一个存储的以及 数据信息的的一些操作方法。今天我们就来...

大蓝妹
2015/09/02
236
2
NSQ系列之nsqlookupd代码分析二(初识nsqlookupd tcpServer)

NSQ系列之nsqlookupd代码分析二(初识nsqlookupd tcpServer) 在上一章初探中了解到,中开启了一个 和一个 ,那么今天我们来初步了解下。 废话不多说,直接上代码吧,简单粗暴点比较好。 通过...

大蓝妹
2015/08/29
413
0
NSQ系列之nsqlookupd代码分析三(详解tcpServer 中的IOLoop方法)

NSQ系列之nsqlookupd代码分析三(详解nsqlookupd tcpServer 中的IOLoop) 上一章我们大致了解了中的的大致的代码,与client也就之间协议处理在这个方法中,今天我们就分析一下这个方法 废话不...

大蓝妹
2015/09/01
546
0
nsqlookupd 入口文件分析

nsq 中 nsqlookupd 角色相对简单,适合作为分析 nsq 的入口 apps/nsqlookupd/nsqlookupd.go nsqlookupd 是一个独立的程序,所以放到 apps 目录下,依赖内部包 nsqlookupd, util,外部包: gi...

智深
2014/07/31
0
0
去中心化分布式服务实时消息平台-NSQ

NSQ是一个基于Go语言的开源的分布式实时消息平台 NSQ可用于大规模系统的实时消息服务,它的设计目标是为在分布式环境下提供一个强大的去除中心化的分布式服务架构,可以每天处理数以亿计的实...

kiwisoft
2016/10/27
22
0
NSQ:分布式的实时消息平台

NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,代码托管在GitHub,其当前最新版本是0.3.1版。 NSQ可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息,...

hejunyi1204
2015/08/14
0
0
OSChina 开源周刊 50 期,每周技术精粹

本周开源资讯 七大科技公司联手设计下一代开源视频格式 jQuery 基金会和 Dojo 基金会合并:Open Web Eclipse 寻求捐赠用于 IDE 等项目的开发 Angular 2.0 调查:43% 选择 Webstorm 编辑器 软...

OSC编辑部
2015/09/04
4.9K
3
游戏服务器骨架--gonet2

欢迎使用 gonet/2是新一代游戏服务器骨架,基于go语言开发,采用了先进的http/2作为服务器端主要通信协议,以microservice作为主要思想进行架构,采用docker作为服务发布手段。相比第一代gon...

xtaci
2015/10/15
3.2K
0
NSQLookupd Main方法分析

上一篇 http://my.oschina.net/astute/blog/296955 已经分析了 nsqlookupd 启动时的命令行解析,最终构造了 NSQLookupd 结构体,这是一个很重要的结构体。 type NSQLookupd struct { options...

智深
2014/08/01
0
0
C#进阶系列——DDD领域驱动设计初探(四):WCF搭建

原文:C#进阶系列——DDD领域驱动设计初探(四):WCF搭建 前言:前面三篇分享了下DDD里面的两个主要特性:聚合和仓储。领域层的搭建基本完成,当然还涉及到领域事件和领域服务的部分,后面再...

杰克.陈
2017/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

c++ qt 组播总结

每个人都有不同的认知规律和习惯, 有的人喜欢搞一套严密的大理论, 论述起来滔滔不绝, 不管自己懂不懂, 反正读者/听者是没搞懂。 有的人喜欢从实践出发, 没看到代码, 不运行一下, 不看...

backtrackx
6分钟前
0
0
Sublime text2安装json格式化插件SublimePrettyJson[Windows]

一、下载SublimePrettyJson插件包 https://github.com/dzhibas/SublimePrettyJson 二、将下载的文件解压放到在package目录下面 C:\Users\lucky\AppData\Roaming\Sublime Text 3\Packages 每个......

lazy~
6分钟前
0
0
安装vue-cli 报4058错误

1. 4058是网络代理错误。 安装淘宝源修改一下就可以了: npm --registry https://registry.npm.taobao.org info underscore 改为cnpm执行: cnpm install --global vue-cli 安装成功: 试试版...

MrBoyce
7分钟前
0
0
CPU飙升分析

1、top -----看具体的进程 2、top -H -p pid ------该进程的线程 3、printf 0x%x 15248 ------将线程改为16进制 4、jstack 进程...

北极之北
10分钟前
1
0
新生代Eden与两个Survivor区的解释

聊聊JVM的年轻代 1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我...

浮躁的码农
12分钟前
0
0
【JVM】JSTATD结合Java VisualVM进行远程监控JVM运行情况(二)

内存泄露指的是程序中动态分配内存给一些临时对象,但是对象不会被GC(java垃圾回收机制gabage collection)所回收,它始终占用内存。即被分配的对象很大但已无用; 内存溢出指的是程序运行过...

大白来袭
15分钟前
2
0
聊聊ribbon的超时时间设置

序 本文主要研究一下ribbon的超时时间设置 配置 实例 ribbon: ReadTimeout: 10000 ConnectTimeout: 10000 MaxAutoRetries: 0 MaxAutoRetriesNextServer: 1 eureka: enabled: ......

go4it
23分钟前
0
0
一行代码结果叹为观止,能做到这么极致的也只有python了

Python 这门语言非常的有趣,不仅可以做高大上的人工智能、大数据、机器学习。还可以用来做 Web、爬虫。还有其它很多的应用。今天我就给大家展示下一行 Python 代码都可以做些什么。 一行打印...

猫咪编程
27分钟前
2
0
KingShard使用

对于kingshard的功能,在git中可以看到明确的功能说明 主要功能: 1. 基础功能 支持SQL读写分离。 支持透明的MySQL连接池,不必每次新建连接。 支持平滑上线DB或下线DB,前端应用无感知。 支...

mickelfeng
29分钟前
0
0
Linux 下 查找某个字符串

如果你想在当前项目下 查找 "test" 这个字符串,可以这样: grep -rn "test" * * : 表示当前目录所有文件,也可以是某个文件名-r 是递归查找-n 是显示行号-R ...

nsns
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部