NSQLookupd 源码分析

启动流程

  1. 利用 svc 创建一个常驻进程
  2. 读取配置,优先级:命令行、配置文件、默认配置
  3. 实例化 nsqlookupd,初始化日志和最核心的注册表。注册表用来记录三种分类数据,分别是 client、topic、channel
  4. 协程启动 tcp server,协程启动 http server 提供服务(wait group)
  5. 等待信号执行关闭 tcp server 和 http server

TCP Server

  1. 等待客户端连接,每个客户端在独立的协程中运行
  2. 连接成功读取 4 个字节代表协议(v1)
  3. 按协议循环处理所有的指令
  4. 当连接关闭时,清理注册表中关于本连接的所有信息
# 指令格式
---------------------------------
cmd p1 p2 p3 ...(空格分隔,换行结尾,idx0 代表指令名,后面的代表参数)
body_len(4 字节) body_content(cmd 可能不包含 body)
---------------------------------

TCP Server V1 协议指令集

  1. ping:记录最后活跃时间,判断连接是否活跃
  2. identify:将本连接记录到注册表,类型为 client。返回一些 nsqlookupd 信息(例如:broadcast_address、version、tcp_port、http_port 等)
  3. register:将本连接记录到注册表,类型为 topic & channel(可能有多台,所以值为数组,元素是连接信息)
  4. unregister:清理本连接的注册表信息, 类型为 topic & channel

HTTP Server 接口

  1. /ping 返回 ok
  2. /info 返回 version
  3. /debug 返回所有注册表信息
  4. /lookup 返回某个 topic 下的所有 channels & nsqd 连接信息(过滤非活跃的,tombstone 和很久无 ping)
  5. /topics 返回所有 topic 信息
  6. /channels 返回某个 topic 下的所有 channel 信息
  7. /nodes 返回所有 topic 关联的节点(过滤非活跃的)
  8. /topic/create 创建 topic 到注册表,但是内容为空
  9. /topic/delete 从注册表删除 topic 和所有该 topic 下的 channel
  10. /channel/create 创建 channel 到注册表,但是内容为空
  11. /channel/delete 从注册表删除 channel
  12. /topic/tombstone 当要清理某个节点的 topic 时,现将 nsqlookupd 注册表里的节点信息不可见,然后再清理。否则小概率可能会删除了某节点的 topic 还有新的消费者继续尝试连接。
    1./debug/pprof/* 都是 pprof 信息

你可能感兴趣的:(NSQLookupd 源码分析)