關於NSQ
NSQ是Go開發的,比較輕量的一款MQ。公司很多項目使用了NSQ作爲消息隊列,也藉此瞭解下NSQ。
先說下NSQ的幾個特性,
- 分佈式部署,沒有單點問題
- 支持水平擴容
- 消息優先存儲在內存(超過限制後可以保持在磁盤)
- Consumer可以動態發現Producer
架構
集羣兩個主要角色:nsqd和nsqlookupd。
nsqd
nsqd負責提供集羣的主要功能,一個nsqd實例同時處理多個數據流。與Kafka類似,一個數據流也可以被稱爲一個topic。NSQ還有一個Channel的概念,類似於Kafka的ConsumerGroup,一個topic可以對應多個Channel,不同的是,每個Channel都存儲一份完整的數據(完整的未消費的數據),而Kafka則是存儲同一份數據,通過Offset來區分不同的ConsumerGroup的消費進度。
Consumer需要指定一個Channel才能消費數據。
一個Channel通常會與多個Consumer Client建立連接。當channel中存在待處理的消息時,Channel會從多個Client中隨機選擇一個進行推送,整個流程如下圖所示,
概括來說,一條消息從Topic廣播到Channel(每個Channel都會收到一份消息),然後再從Channel分發到Consumer。
nsqlookupd
nsqlookupd主要提供服務發現功能,Consumer可以通過nsqlookupd來知道它要消費的Channel數據分佈在哪些nsqd實例。
交互
每個nsqd都會與nsqlookupd建立一個TCP長連接,並且定期向nsqlookupd上報自己的狀態信息,主要包括自己當前處理那些Topic以及對應Topic包含哪些Channel。
參考資料
- https://nsq.io/overview/features_and_guarantees.html