NSQ架構
NSQ組件
NSQ 由 3 個守護進程組成:
- nsqd 是接收、隊列和傳送消息到客戶端的守護進程。
- nsqlookupd 是管理的拓撲信息,並提供了最終一致發現服務的守護進程。
- nsqadmin 是一個 Web UI 來實時監控集羣(和執行各種管理任務)。
Topic消息的邏輯關鍵詞
- topic 是 NSQ 消息發佈的 邏輯關鍵詞 ,可以理解爲人爲定義的一種消息類型。當程序初次發佈帶 topic 的消息時,如果 topic 不存在,則會在 nsqd中創建。
Producer消息的生產者/發佈者
- producer 通過 HTTP API 將消息發佈到 nsqd 的指定 topic ,一般有 pub/mpub 兩種方式, pub 發佈一個消息, mpub 一個往返發佈多個消息。
- producer 也可以通過 nsqd客戶端 的 TCP接口 將消息發佈給 nsqd 的指定 topic 。
- 當生產者 producer 初次發佈帶 topic 的消息給 nsqd 時,如果 topic 不存在,則會在 nsqd 中創建 topic 。
Channel消息傳遞的通道
- 當生產者每次發佈消息的時候,消息會採用多播的方式被拷貝到各個 channel 中, channel 起到隊列的作用。
- channel 與 consumer(消費者) 相關,是消費者之間的負載均衡,消費者通過這個特殊的channel讀取消息。
- 在 consumer 想單獨獲取某個 topic 的消息時,可以 subscribe(訂閱)一個自己單獨命名的nsqd中還不存在的 channel, nsqd會爲這個 consumer創建其命名的 channel
- Channel 會將消息進行排列,如果沒有 consumer讀取消息,消息首先會在內存中排隊,當量太大時就會被保存到磁盤中。可以在配置中配置具體參數。
- 一個 channel 一般會有多個 consumer 連接。假設所有已連接的 consumer 處於準備接收消息的狀態,每個消息將被傳遞到一個隨機的 consumer。
- Go語言中的channel是表達隊列的一種自然方式,因此一個NSQ的topic/channel,其核心就是一個存放消息指針的Go-channel緩衝區。緩衝區的大小由 --mem-queue-size 配置參數確定。
Consumer消息的消費者
- consumer 通過 TCP subscribe 自己需要的 channel
topic 和 channel 都沒有預先配置。 topic 由第一次發佈消息到命名 topic 的 producer 創建 或第一次通過 subscribe 訂閱一個命名 topic 的 consumer 來創建。 channel 被 consumer 第一次 subscribe 訂閱到指定的 channel 創建。 - 多個 consumer subscribe一個 channel,假設所有已連接的客戶端處於準備接收消息的狀態,每個消息將被傳遞到一個 隨機 的 consumer。
- NSQ 支持延時消息, consumer 在配置的延時時間後才能接受相關消息。
- Channel在 consumer 退出後並不會刪除,這點需要特別注意。
NSQ流程圖
NSQ使用
首先啓動 nsdlookupd
nsqlookupd
- 客戶端通過查詢 nsdlookupd 來發現指定topic的生產者,並且 nsqd 節點廣播 topic 和通道 channel 信息
- 該服務運行後有兩個端口:TCP 接口,nsqd 用它來廣播;HTTP 接口,客戶端用它來發現和管理。
- 在生產環境中,爲了高可用,最好部署三個nsqlookupd服務。
先創建 nsqd 的數據路徑
mkdir /tmp/nsqdata1 /tmp/nsqdata2
運行兩個測試的 nsqd 實例
nsqd --lookupd-tcp-address=127.0.0.1:4160 -broadcast-address=127.0.0.1 -tcp-address=127.0.0.1:4150 -http-address=0.0.0.0:4151 -data-path=/tmp/nsqdata1
nsqd --lookupd-tcp-address=127.0.0.1:4160 -broadcast-address=127.0.0.1 -tcp-address=127.0.0.1:4152 -http-address=0.0.0.0:4153 -data-path=/tmp/nsqdata2
- nsqd 可以獨立運行,不過通常它是由 nsdlookupd 實例所在集羣配置的(它在這能聲明 topics和 channels ,以便大家能找到)
- 服務啓動後有兩個端口:一個給客戶端(TCP),另一個是 HTTP API。還能夠開啓HTTPS。
- 同一臺服務器啓動多個 nsqd ,要注意端口和數據路徑必須不同,包括: –lookupd-tcp-address 、 -tcp-address 、 –data-path
- 刪除 topic 、channel 需要 HTTP API 調用。
啓動 nsqadmin 前端Web監控
nsqadmin --lookupd-http-address=localhost:4161
- nsqadmin 是一套 WEB UI ,用來彙集集羣的實時統計,並執行不同的管理任務。
- 運行後,能夠通過4171端口查看並管理 topic 和 channel 。
- nsqadmin 通常只需要運行一個。