zeromq與nanomsg比較

Tyler Treat是一名軟件開發人員,他近日發表了一篇博文《爲何ZeroMQ不該該成爲你的第一選擇》。算法

文中,Tyler Treat對nanomsg和ZeroMQ進行了比較。nanomsg是一個套接字庫,提供了多種常見的通訊協議,其目標是使網絡層更快、更具擴展性、更容易使用。它用C進行了完全地重寫,能夠說是對ZeroMQ的重建。它構建在ZeroMQ的可靠性能之上,同時又提供了若干重要的改進。並且,它還試圖消除ZeroMQ常常出現一些怪異行爲。做者從如下幾個方面對兩者進行了比較:安全

  • 用於新傳輸協議的API——對於ZeroMQ,人們常常抱怨的問題是它沒有提供用於新傳輸協議的API,這從根本上把用戶限制在TCP、PGM、IPC和ITC上。而nanomsg提供了一個可插拔的接口,用於新的傳輸(如WebSockets)和消息協議。網絡

  • POSIX兼容性——nanomsg徹底兼容POSIX,並且API更簡潔,兼容性更好。在ZeroMQ中,套接字用空指針表示,而後綁定到上下文;而在nanomsg中,只須要初始化一個新的套接字並使用它,一步便可完成。架構

  • 線程安全——ZeroMQ在架構上有一個根本性缺陷:其套接字不是線程安全的。在ZeroMQ中,每一個對象都被隔離在本身的線程中,所以不須要信號量和互斥鎖。併發是經過消息傳遞實現的。nanomsg消除了對象與線程間的一對一關係,它再也不依賴於消息傳遞,而是將交互建模爲一組狀態機。所以,nanomsg套接字是線程安全的。併發

  • 內存和CPU使用效率——ZeroMQ使用一種很簡單的Trie結構存儲和匹配發布/訂閱服務。當訂閱數超過10000時,該結構很快就顯現出不合理之處了。nanomsg則使用一種稱爲「基數樹(radix tree)」的結構來存儲訂閱,並提供了真正的零複製API,容許內存從一臺機器複製到另外一臺機器,並且徹底不須要CPU的參與,這極大地提升了性能。負載均衡

  • 負載均衡算法——ZeroMQ採用了輪轉調度算法。雖然該算法能夠平均分配工做,但也有其侷限性。好比,有兩個數據中心,一個在倫敦,一個在紐約。在理想狀況下,一個位於倫敦數據中心的網站,其請求不該該路由到紐約。但在ZeroMQ的負載均衡算法裏,這徹底有可能。而nanomsg避免了這種狀況的出現。分佈式

除此以外,文中還提到,nanomsg提供了一個名爲nanocat的命令行工具,用於與系統進行交互。工具

做者繼續寫道,nanomsg旨在實現「可擴展協議(Scalability Protocols)」,用於構建可擴展的高性能分佈式系統。當前,它定義了六種不一樣的可擴展協議:PAIR、REQREP、PIPELINE、BUS、PUBSUB和SURVEY。性能

既然nanomsg在ZeroMQ的基礎上作了如此多的改進,那咱們爲何還要用ZeroMQ呢?針對這個疑問,做者指出,nanomsg還相對年輕,它尚未達到ZeroMQ的成熟度,沒有像ZeroMQ那樣有一個繁榮的開發者社區。另外,ZeroMQ有豐富的文檔及其它資源,能夠幫助開發人員使用它,而nanomsg的文檔很是少。測試

儘管如此,做者仍是認爲nanomsg所作的改進,尤爲是它的可擴展協議,使它很是有吸引力。從技術上講,從三月份開始,nanomsg就已經開始beta測試,所以,生產就緒版本已經指日可待。


感謝郭蕾對本文的審校。

給InfoQ中文站投稿或者參與內容翻譯工做,請郵件至editors@cn.infoq.com。也歡迎你們經過新浪微博(@InfoQ)或者騰訊微博(@InfoQ)關注咱們,並與咱們的編輯和其餘讀者朋友交流。

相關文章
相關標籤/搜索