今天来说说NSQD.TCPServer中的核心函数IOLoop的具体实现,IOLoop主要的工作是接收和响应客户的命令。同时开启messagePump goroutine 进行心跳检查,给订阅者发生消息等操作。
详细流程参考 https://blog.csdn.net/H_L_S/article/details/104709619 中的逻辑流程图。
主要代码文件:
1.nsqd/protocol_v2.go
IOLoop函数
func (p *protocolV2) IOLoop(conn net.Conn) error {
....
//客户端实例化
clientID := atomic.AddInt64(&p.ctx.nsqd.clientIDSequence, 1)
client := newClientV2(clientID, conn, p.ctx)
p.ctx.nsqd.AddClient(client.ID, client)
...
//messagePump启动信号,当 messagePump初始化完成,才能开始进行命令处理
messagePumpStartedChan := make(chan bool)
go p.messagePump(client, messagePumpStartedChan)
<-messagePumpStartedChan
for {
//net.Conn 读超时设置
if client.HeartbeatInterval > 0 {
client.SetReadDeadline(time.Now().Add(client.HeartbeatInterval * 2))
} else {
client.SetReadDeadline(zeroTime)
}