首页 文章 中间件 nsq 源码笔记 -- nsqlookup
0
0
0
14

nsq 源码笔记 -- nsqlookup

nsq nsqlookup 源码 笔记 nsq

下载

go get -u github.com/kr/godep
godep get github.com/bitly/nsq/...

如果被墙了,更新到 go 最新版本,我当前是 1.12版本

然后修改下 /etc/environment , 加入下面这句,重新登录系统

export GOPROXY=https://goproxy.io

 

编译

make

 

启动

nsqlookupd &
nsqd --lookupd-tcp-address=127.0.0.1:4160 &
nsqadmin --lookupd-http-address=127.0.0.1:4161 &
curl -d "hello world 1" "http://127.0.0.1:4151/pub?topic=test"

 

简介

由 nsqlookup  nsqd nsqadmin 3份源码组成

nsqlookup  是发现协议服务器,登记有哪些 nsqd,哪些topic 哪些channel.  

nsqadmin 通过http接口访问 nsqlook ,对外提供简单的操作,及显示当前的系统运行情况

nsqd 真实的干活程序,消息存储,转发。接受订阅 ... 

 

nsqlookup

源码主要类型介绍

type Registration struct {
    Category string   "topic" "channel"
    Key      string
    SubKey   string
}

所有的 topic channel nsqd 都被存到 registration 中
Category 为 "topic" 存的是 topic 
Category 为 "channel" 存的是 channel
Category 为 "client" 存的是 nsqd的地址和端口号
Key topicName   SubKey channelName

{"topic", "topicName", ""}
{"channel", "topicName", "channelName1"}
{"channel", "topicName", "channelName2"}

{"channel", "topicName", "*"} 匹配 topicName 下 所有的 channel
{"topic", "*", ""} 匹配所有的 topic

Producer
生产者   存有远端信息 地址 广播地址啊 tcp http 端口啊 等等
是否被标记为墓碑,标记墓碑的时间
 

nsqlookup源码分析

nsqlookupd.Main() 启动后
开启goroutine G1 侦听 tcp 端口
再开启 goroutine G2 侦听 http 端口

G1 每收到一个nsqd连接 便新建 G1G goroutine
G1G 一直运行在 IOLoop() 中 目前支持 4个命令
 

tcp 的 4 个命令

"PING"
心跳包

"IDENTIFY"
把 nsqd 的 网址和端口 加到nsqlookupd.DB map中
key Registration{"client", "", ""}  value  Producer{peerInfo: client.peerInfo}
相当于在 nslookup 添加了一条 nsqd 的信息 表明有个 nsqd 注册上来了

REGISTER topicName [channelName]
添加产品,有2种情况
如果 channelName 不为空 添加 Registration{"channel", topic, channel} 的Producer
否则 添加 Registration{"topic", topic, ""} 的 Producer
Producer 其实就保存了 nsqd的网址和端口信息   Producer{peerInfo: client.peerInfo}

UNREGISTER
和  REGISTER 类似
如果有 channel 那么就删除 Registration{"channel", topic, channel} 一个产品
否则 删除 Registration{"topic", topic, ""}  topic 下所有channel的产品, 然后删除topic的产品

如果是 #ephemeral 的,会在产品全部被删完后 把nsqlookupd.DB的key 也删除了
否则,就算产品全部被删除, key 也不会删除
 

http的一些命令

G2 主要支持下面的命令

/ping
直接回复 ok

/info
返回版本号  version.Binary

doTopics
获取所有的 topics

doChannels
获取某个 topic 的所有 channel

doCreateTopic
其实就是在 registrationMap 中插入一条 Registration{"topic", "topicName", ""}

doLookup
查找指定 topicName的所有 channels 和 producers
会过滤掉 太久没active的producer  (Options.InactiveProducerTimeout 中配置)
已经被标记为墓碑,且墓碑标记还没失效 Options.TombstoneLifetime 可以配置墓碑的有效期

doDeleteTopic
先删 topic 的 channels 再删 topic

doTombstoneTopicProducer
用户指定 topicName 和 node
遍历 topicName 下的所有 Producer
thisNode := fmt.Sprintf("%s:%d", p.peerInfo.BroadcastAddress, p.peerInfo.HTTPPort)
如果 thisNode == 用户指定的node
把这个 Producer 标记为墓碑状态,  墓碑的有效期 在 Options.TombstoneLifetime 中配置

doCreateChannel
如果不存在则创建
先创建 Registration{"channel", topicName, channelName}
再创建 Registration{"topic", topicName, ""}

doDeleteChannel
删除指定的topic下的某个channel
依照目前的源码 {"channel","topicName","channelName"} 是唯一的

topicName 如果为 "*" , nslookup 应该会认为它不是一个合法的名字 而直接返回
所以不存在 用户指定 {"channel","*","channelName"} 而 删除所有叫做 channelName 的channel

doNodes
返回所有注册到 nslookup 的 nsqd
 

到此这篇关于“nsq 源码笔记 -- nsqlookup”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持Go语言编程网!

相关文章

创建博客

开始创作
写作能提升自己能力,也能为他人分享知识。

在线教程

查看更多
  • Go入门指南

    Go入门指南

  • Go语言高级编程

    Go语言高级编程

  • Go Web 编程

    Go Web 编程

  • GO专家编程

    GO专家编程

  • Go语言四十二章经

    Go语言四十二章经

  • 数据结构和算法(Golang实现)

    数据结构和算法(Golang实现)

Go语言编程网

微信扫码关注订阅号


博客 资讯 教程 我的