NATS_01:NATS基礎介紹


1、介紹

NATS(Message bus): 從CloudFoundry的總架構圖看,位於各模塊中心位置的是一個叫nats的組件。NATS是由CloudFoundry的架構師Derek開發的一個開源的、輕量級、高性能的,支持發布、訂閱機制的分布式消息隊列系統。它的核心基於EventMachine開發,代碼量不多,可以下載下來慢慢研究。其核心原理就是基於消息發布訂閱機制。每個台服務 器上的每個模塊會根據自己的消息類別,向MessageBus發布多個消息主題;而同時也向自己需要交互的模塊,按照需要的信息內容的消息主題訂閱消息。 NATS原來是使用Ruby編寫,可以實現每秒150k消息,后來使用Go語言重寫,能夠達到每秒8-11百萬個消息,整個程序很小只有3M Docker image,它不支持持久化消息,如果你離線,你就不能獲得消息。

NATS適合雲基礎設施的消息通信系統、IoT設備消息通信和微服務架構。Apcera團隊負責維護NATS服務器(Golang語言開發)和客戶端(包括Go、Python、Ruby、Node.js、Elixir、Java、Nginx、C和C#),開源社區也貢獻了一些客戶端庫,包括Rust、PHP、Lua等語言的庫。目前已經采用了NATS系統的公司有:愛立信、HTC、百度、西門子、VMware。

市面上常見到的和Nats功能類似的消息通信系統有:

ActiveMQ(Java編寫)、KafKa(Scala編寫)、RabbitMq(Erlang編寫)、Nats(之前是Ruby編寫現已修改為Go)、Redis(C語言編寫)、Kestrel(Scala編寫不常用)、NSQ(Go語言編寫),這些消息通信系統在Broker吞吐量方面的比較:(注:來自作者Derek Collison 對不同版本的消息系統進行的比較)

  

  按照其官網的說法,NATS是一個開源的、高性能的、簡潔的、靈活的 適用於現代的可靠靈活的雲和分布式系統的中樞系統。 說的很玄乎,實際上就是一個分布式的消息隊列系統,支持PubSub/ReqRsp 模型。其最初由Apcera領導開發,並實現了Ruby版本的服務器和客戶端,其主要作者Derek Collison自稱做了20多年的MQ,並經歷過TIBOC、Rendezvous、EMC公司,這里有他自己的reddit回答

  根據github里面ruby-nats的日志顯示在11年Derek實現了Ruby版本的NATS服務器以及對應的客戶端。然后在12年末,姑且認為是13年Derek又用Golang將服務器重寫了一遍,並最終發現其效果更好,於是現在慢慢將Ruby版本的服務器淘汰了,現在官網也只維護一個Golang版本的服務器,也就是我們這里的gnatsd。

2、NATS服務器與客戶端

NATS服務器:用Golang語言開發,發行版包括二進制發布包和Docker鏡像。

NATS客戶端:包含了多種語言的客戶端。

  官方提供的客戶端

    Go client:   https://github.com/nats-io/go-nats

    Node.js client: https://github.com/nats-io/node-nats

    Ruby client:  https://github.com/nats-io/ruby-nats

    Java client:   https://github.com/nats-io/jnats

    C client:     https://github.com/nats-io/cnats

    C# client:   https://github.com/nats-io/csnats

    Nginx C client:https://github.com/nats-io/nginx-nats

  還有社區提供的客戶端:

    Spring: https://github.com/cloudfoundry-community/java-nats

    Lua:   https://github.com/DawnAngel/lua-nats

    PHP:    https://github.com/repejota/phpnats

    Python:https://github.com/mcuadros/pynats

    Scala:   https://github.com/tyagihas/scala_nats/

    Haskell:https://github.com/ondrap/nats-queue

對於Golang客戶端API文檔,需要這樣:

1)用 Go 下載 go版本客戶端源碼及使用文檔

  $ go git https://github.com/nats-io/go-nats.git

2)使用 Go 文檔查看器來查看線上文檔

  $ godoc -http :8080

   3)通過瀏覽器訪問 API 文檔

  http://localhost:8080/pkg/github.com/nats-io/gnatsd/

   注意:通過 Go 下載的項目源碼包,都可以通過這種方式去打開對應的 API 文檔。例如我從網上下載有關 GoWeb 開發的 beego 項目,也可以通過訪問:http://localhost:8080/pkg/github.com/astaxie/beego/ 來查看對應 beego 的 API 文檔。

3、NATS的設計目標

  NATS的設計原則是:高性能、可伸縮能力、易於使用,基於這些原則,NATS的設計目標包括: 
    1)高性能(fast) 
    2)一直可用(dial tone) 
    3)極度輕量級(small footprint) 
    4)最多交付一次(fire and forget,消息發送后不管) 
    5)支持多種消息通信模型和用例場景(flexible)

4、NATS應用場景

  NATS理想的使用場景有:

    1)尋址、發現 
    2)命令和控制(控制面板) 
    3)負載均衡 
    4)多路可伸縮能力 
    5)定位透明 
    6)容錯

  NATS設計哲學認為,高質量的QoS應該在客戶端構建,故只建立了請求-應答,不提供:

    1)持久化 
    2)事務處理 
    3)增強的交付模式 
    4)企業級隊列 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM