這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
NSQ是一個基於Go語言的分布式即時訊息平台,它基於MIT開源協議發布,代碼託管在GitHub,其當前最新版本是0.3.1版。NSQ可用於大規模系統中的即時Message Service,並且每天能夠處理數億層級的訊息,其設計目標是為在分布式環境下啟動並執行去中心化服務提供一個強大的基礎架構。NSQ具有分布式、去中心化的拓撲結構,該結構具有無單點故障、故障容錯、高可用性以及能夠保證訊息的可靠傳遞的特徵。NSQ非常容易配置和部署,且具有最大的靈活性,支援眾多訊息協議。另外,官方還提供了拆箱即用Go和Python庫。如果讀者興趣構建自己的用戶端的話,還可以參考官方提供的協議規範。
NSQ是由四個重要組件構成:
- nsqd:一個負責接收、排隊、轉寄訊息到用戶端的守護進程
- nsqlookupd:管理拓撲資訊並提供最終一致性的探索服務的守護進程
- nsqadmin:一套Web使用者介面,可即時查看叢集的統計資料和執行各種各樣的管理工作
- utilities:常見基礎功能、資料流處理工具,如nsq_stat、nsq_tail、nsq_to_file、nsq_to_http、nsq_to_nsq、to_nsq
NSQ的主要特點如下:
- 具有分布式且無單點故障的拓撲結構 支援水平擴充,在無中斷情況下能夠無縫地添加叢集節點
- 低延遲的訊息推送,參見官方提供的效能說明文檔
- 具有組合式的負載平衡和多播形式的訊息路由
- 既擅長處理面向流(高輸送量)的工作負載,也擅長處理面向Job的(低輸送量)工作負載
- 訊息資料既可以儲存於記憶體中,也可以儲存在磁碟中
- 實現了生產者、消費者自動探索和消費者自動連接生產者,參見nsqlookupd
- 支援安全傳輸層協議(TLS),從而確保了訊息傳遞的安全性
- 具有與資料格式無關的訊息結構,支援JSON、Protocol Buffers、MsgPacek等訊息格式
- 非常易於部署(幾乎沒有依賴)和配置(所有參數都可以通過命令列進行配置)
- 使用了簡單的TCP協議且具有多種語言的用戶端功能庫
- 具有用於資訊統計、管理員操作和實現生產者等的HTTP介面
- 為即時檢測整合了統計資料收集器StatsD
- 具有強大的叢集管理介面,參見nsqadmin
為了達到高效的分布式Message Service,NSQ實現了合理、智能的權衡,從而使得其能夠完全適用於生產環境中,具體內容如下:
- 支援訊息記憶體隊列的大小設定,預設完全持久化(值為0),訊息即可持久到磁碟也可以儲存在記憶體中
- 保證訊息至少傳遞一次,以確保訊息可以最終成功發送
- 收到的訊息是無序的, 實現了鬆散訂購
- 探索服務nsqlookupd具有最終一致性,訊息最終能夠找到所有Topic生產者
官方和第三方還為NSQ開發了眾多用戶端功能庫,如官方提供的基於HTTP的nsqd、Go用戶端go-nsq、Python用戶端pynsq、基於Node.js的JavaScript用戶端nsqjs、非同步C用戶端libnsq、Java用戶端nsq-java以及基於各種語言的眾多第三方用戶端功能庫。更多用戶端功能庫,請讀者點擊這裡查看。
從NSQ的設計文檔中得知,單個nsqd被設計為一次能夠處理多個流資料,NSQ中的資料流模型是由stream和consumer組成。Topic是一種獨特的stream,Channel是一個訂閱了給定Topic的consumer邏輯分組。NSQ的資料流模型結構如所示:
從可以看出,單個nsqd可以有多個Topic,每個Topic又可以有多個Channel。Channel能夠接收Topic所有訊息的副本,從而實現了訊息多播分發;而Channel上的每個訊息被分發給它的訂閱者,從而實現負載平衡,所有這些就組成了一個可以表示各種簡單和複雜拓撲結構的強大架構。
NSQ最初為提供短連結服務的應用Bitly而開發。另外,還有眾多著名的應用在使用NSQ,如社交新聞網站Digg、私密的社交應用Path、著名的開源的應用程式容器引擎Docker、支付公司Stripe、新聞彙總網站Buzzfeed、查看家人所在位置的行動裝置 AppLife360、網路工具公司SimpleReach等。
有興趣的讀者還可以為NSQ貢獻代碼、反饋問題或者通過官方提供的快速入門教程體驗下NSQ為高輸送量的網路服務帶來的效能提升。有關NSQ的安裝部署、用戶端開發等相關資訊,請登入其官網查看。
感謝郭蕾對本文的審校。