nsq原始碼 nsqd總體流程

2022-06-28 17:36:13 字數 1149 閱讀 9667

看了一陣子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...