nsq源码学习-nsqd

一、nsqd main函数

nsqd在执行中会执行两个协程,一个是queueScanLoop,另一个是lookupLoop。下面先分析queueScanLoop的主要内容。

queueScanLoop

每隔QueueScanInterval时间(默认100ms),从所有topic的所有channel中随机选取num(默认值为QueueScanSelectionCount)个channel,将其投递到workCh中。再由特定数量的协程(worker),从workCh读取channel,处理两个队列:InFlight队列和Deferred队列,处理的函数分别是processInFlightQueue和processDeferredQueue。如果两个队列中有任意一个发生了数据处理,即将数据从队列中弹出,写入该channel的memoryChan或者硬盘,则这个channel被认为是dirty。
当num个channel扫描完毕之后,再统计状态为dirty的channel占num的比例。如果dirty比例大于QueueScanDirtyPercent,则接着重复扫描channel。否则,执行下一次循环,每隔QueueScanRefreshInterval时间(5s)更新缓存中的channel,并resize协程池中的协程数量。

lookupLoop

这个协程也是一个循环,每隔15s向nsqlookupd发送一次心跳包,同时将topic、channel的变化通知到nsqlookupd。

二、nsqd与客户端交互协议protocol_v2

客户端与nsqd建立tcp连接后,nsqd对每一条tcp连接调用IOloop。IOLoop中主要做两件事:一是执行客户端发出的各种命令;二是执行messagaPump将客户端订阅的channel中的消息发送给客户端。

发布了24 篇原创文章 · 获赞 0 · 访问量 3365

猜你喜欢

转载自blog.csdn.net/GuXiaoyan12/article/details/104399466
nsq