nsq nsqd源码1
博客专区 > 昏鸦 的博客 > 博客详情
nsq nsqd源码1
昏鸦 发表于4年前
nsq nsqd源码1
  • 发表于 4年前
  • 阅读 167
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: nsq 一个golang实现的消息队列

1 启动类: main.go

 

利用:flag.NewFlagSet 解析传递的参数

'注册系统的信号量

exitChan := make(chan int)

    signalChan := make(chan os.Signal, 1)

    go func() {

        <-signalChan

        exitChan <- 1

    }()

    signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)

 

调用optios.go 做默认的参数  NewNSQDOptions

 

启动server的服务: nsqd := NewNSQD(opts)

 

加载硬盘上的数据:nsqd.LoadMetadata()

    err := nsqd.PersistMetadata()

 

nsqd.Main()

执行lookup 服务的初始化工作

n.waitGroup.Wrap(func() { n.lookupLoop() })

 

n.waitGroup.Wrap(func() { util.TCPServer(n.tcpListener, tcpServer) }) 开启tcp的监听服务

 

n.waitGroup.Wrap(func() { util.HTTPServer(n.httpListener, httpServer) }) 开始http的监听服务

 

main.go 的流程走完

 

接下来看看有客户端连接以后的服务:

tcp.go

     (p *tcpServer) Handle(clientConn net.Conn)

                   一系列的校验。。。

         调用:ProtocolV2. IOLoop

                            client := NewClientV2(clientID, conn, p.context) 初始化客户端

                                               go p.messagePump(client) 客户select服务

response, err := p.Exec(client, params)  执行具体的客户端操作

func (p *ProtocolV2) Exec(client *ClientV2, params [][]byte) ([]byte, error) {
    switch {
    case bytes.Equal(params[0], []byte("FIN")):
        return p.FIN(client, params)
    case bytes.Equal(params[0], []byte("RDY")):
        return p.RDY(client, params)
    case bytes.Equal(params[0], []byte("REQ")):
        return p.REQ(client, params)
    case bytes.Equal(params[0], []byte("PUB")):
        return p.PUB(client, params)
    case bytes.Equal(params[0], []byte("MPUB")):
        return p.MPUB(client, params)
    case bytes.Equal(params[0], []byte("NOP")):
        return p.NOP(client, params)
    case bytes.Equal(params[0], []byte("TOUCH")):
        return p.TOUCH(client, params)
    case bytes.Equal(params[0], []byte("IDENTIFY")):
        return p.IDENTIFY(client, params)
    case bytes.Equal(params[0], []byte("SUB")):
        return p.SUB(client, params)
    case bytes.Equal(params[0], []byte("CLS")):
        return p.CLS(client, params)
    }
    return nil, util.NewFatalClientErr(nil, "E_INVALID", fmt.Sprintf("invalid command %s", params[0]))
}



共有 人打赏支持
粉丝 7
博文 143
码字总数 54861
×
昏鸦
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: