NSQ:分布式的實時消息平臺
原文 http://www.infoq.com/cn/news/2015/02/nsq-distributed-message-platform
NSQ 是一個基于Go語言的分布式實時消息平臺,它基于 MIT開源協議 發布,代碼托管在GitHub,其當前最新版本是 0.3.1版 。NSQ可用于大規模系統中的實時消息服務,并且每天能夠處理數億級別的消息,其設計目標是為在分布式環境下運行的去中心化服務提供一個強大的基礎架構。 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
為了達到高效的分布式消息服務,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 、查看家人所在位置的移動應用 Life360 、網絡工具公司 SimpleReach 等。
有興趣的讀者還可以為NSQ貢獻代碼、 反饋問題 或者通過官方提供的 快速入門教程 體驗下NSQ為高吞吐量的網絡服務帶來的性能提升。有關NSQ的安裝部署、客戶端開發等相關信息,請登錄 其官網 查看。