看了一陣子nsq原始碼,出去細節大體的流程基本算是看明白了
下面來總結一下,看下面的圖
個人覺得其實只要搞清楚幾個loop,我稱為「守護」協程,也就是一直在for... select... 裡面跑著不退出的幾個關鍵函式。
看上面的圖,有幾個呢?
從底層依次往上看
diskqueue.ioloop(): 我覺得這個第乙個要看懂,topic和channel都會用到他來作為磁碟儲存訊息,關鍵訊息在裡面怎麼進怎麼出,這裡也要搞清楚。
topic.messagepump(): 不斷的將topci收到的訊息,分發給底下所有的channel。
protocolv2.ioloop(): 處理客戶端通過socket傳上來的指令,然後分發處理指令。比如收到pub指令,將訊息丟給topic
protocolv2.messagepump(): 不斷的將channel.memorymsgchan或者diskqueue裡面的訊息通過socket推給客戶端訂閱者
nsqd.queuescanloop(): 其實看上面的協程都是成對出現的,也就是訊息有進去協程,就應該有訊息出來的協程。但是channel有訊息進去的協程,也就是topic的messagepump這個協程負責將訊息給channel,那麼channel訊息出來的協程就是這個nsqd.queuescanloop()了。他負責將inflight也就是處理中的訊息,推到channel.memorymsgchan或者diskqueue中。
乙個完整的訊息進出流程大概就是這樣子
客戶端生產者 -> protocolv2.ioloop() 收到訊息
-> topic.putmessage() 訊息傳到topic
-> topic.messagepump() 訊息傳到channel.inflight
-> nsqd.queuescanloop()
-> 訊息傳到channel.memorymsgchan
-> protocolv2.messagepump()
-> 客戶端訂閱者
這裡有乙個很容易搞暈的地方,就是channel中放訊息其實有兩塊
type channel struct
NSQ原始碼分析之概述
目前,看了nsqlookupd的 寫的真的很精美,我覺得 可以和redis相媲美,這等後續分析 時再詳說 關於nsq的特性,可以檢視nsq官網 這篇文章主要分析以下幾點 nsq提供了三大元件以及一些工具,三大元件為 nqsd nsq主要元件,用於儲存訊息以及分發訊息 nsqlookupd 用於管理n...
NSQ 原始碼分析之NSQD ProtocolV2
今天來說說nsqd.tcpserver中的核心函式ioloop的具體實現,ioloop主要的工作是接收和響應客戶的命令。同時開啟messagepump goroutine 進行心跳檢查,給訂閱者發生訊息等操作。詳細流程參考 中的邏輯流程圖。主要 檔案 1.nsqd protocol v2.go io...
NSQ 原始碼分析之NSQD Topic
今天主要講的是nsq topic 的 實現,topic作為mq的重要概念,了解它的實現,對我們理解其他mq的topic,有很多的益處。主要 檔案 1.nsqd topic.go topic結構體 type topic structnewtopic 函式 主要做三件事,一是例項化topic,二是開啟m...