nsq 源码笔记 -- nsqlookup

2 篇文章 0 订阅

下载

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
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值