启动流程
- 利用 svc 创建一个常驻进程
- 读取配置,优先级:命令行、配置文件、默认配置
- 实例化 nsqlookupd,初始化日志和最核心的注册表。注册表用来记录三种分类数据,分别是 client、topic、channel
- 协程启动 tcp server,协程启动 http server 提供服务(wait group)
- 等待信号执行关闭 tcp server 和 http server
TCP Server
- 等待客户端连接,每个客户端在独立的协程中运行
- 连接成功读取 4 个字节代表协议(v1)
- 按协议循环处理所有的指令
- 当连接关闭时,清理注册表中关于本连接的所有信息
# 指令格式
---------------------------------
cmd p1 p2 p3 ...(空格分隔,换行结尾,idx0 代表指令名,后面的代表参数)
body_len(4 字节) body_content(cmd 可能不包含 body)
---------------------------------
TCP Server V1 协议指令集
- ping:记录最后活跃时间,判断连接是否活跃
- identify:将本连接记录到注册表,类型为 client。返回一些 nsqlookupd 信息(例如:broadcast_address、version、tcp_port、http_port 等)
- register:将本连接记录到注册表,类型为 topic & channel(可能有多台,所以值为数组,元素是连接信息)
- unregister:清理本连接的注册表信息, 类型为 topic & channel
HTTP Server 接口
- /ping 返回 ok
- /info 返回 version
- /debug 返回所有注册表信息
- /lookup 返回某个 topic 下的所有 channels & nsqd 连接信息(过滤非活跃的,tombstone 和很久无 ping)
- /topics 返回所有 topic 信息
- /channels 返回某个 topic 下的所有 channel 信息
- /nodes 返回所有 topic 关联的节点(过滤非活跃的)
- /topic/create 创建 topic 到注册表,但是内容为空
- /topic/delete 从注册表删除 topic 和所有该 topic 下的 channel
- /channel/create 创建 channel 到注册表,但是内容为空
- /channel/delete 从注册表删除 channel
- /topic/tombstone 当要清理某个节点的 topic 时,现将 nsqlookupd 注册表里的节点信息不可见,然后再清理。否则小概率可能会删除了某节点的 topic 还有新的消费者继续尝试连接。
1./debug/pprof/* 都是 pprof 信息