NATS(Message bus): 從CloudFoundry的總架構圖看,位於各模塊中心位置的是一個叫nats的組件。NATS是由CloudFoundry的架構師Derek開發的一個開源的、輕量級、高性能的,支持發佈、訂閱機制的分佈式消息隊列系統。它的核心基於EventMachine開發,代碼量很少,能夠下載下來慢慢研究。其核心原理就是基於消息發佈訂閱機制。每一個臺服務 器上的每一個模塊會根據本身的消息類別,向MessageBus發佈多個消息主題;而同時也向本身須要交互的模塊,按照須要的信息內容的消息主題訂閱消息。 NATS原來是使用Ruby編寫,能夠實現每秒150k消息,後來使用Go語言重寫,可以達到每秒8-11百萬個消息,整個程序很小隻有3M Docker image,它不支持持久化消息,若是你離線,你就不能得到消息。php
NATS適合雲基礎設施的消息通訊系統、IoT設備消息通訊和微服務架構。Apcera團隊負責維護NATS服務器(Golang語言開發)和客戶端(包括Go、Python、Ruby、Node.js、Elixir、Java、Nginx、C和C#),開源社區也貢獻了一些客戶端庫,包括Rust、PHP、Lua等語言的庫。目前已經採用了NATS系統的公司有:愛立信、HTC、百度、西門子、VMware。java
市面上常見到的和Nats功能相似的消息通訊系統有:node
ActiveMQ(Java編寫)、KafKa(Scala編寫)、RabbitMq(Erlang編寫)、Nats(以前是Ruby編寫現已修改成Go)、Redis(C語言編寫)、Kestrel(Scala編寫不經常使用)、NSQ(Go語言編寫),這些消息通訊系統在Broker吞吐量方面的比較:(注:來自做者Derek Collison 對不一樣版本的消息系統進行的比較)nginx
按照其官網的說法,NATS是一個開源的、高性能的、簡潔的、靈活的 適用於現代的可靠靈活的雲和分佈式系統的中樞系統。 說的很玄乎,實際上就是一個分佈式的消息隊列系統,支持PubSub/ReqRsp 模型。其最初由Apcera領導開發,並實現了Ruby版本的服務器和客戶端,其主要做者Derek Collison自稱作了20多年的MQ,並經歷過TIBOC、Rendezvous、EMC公司,這裏有他本身的reddit回答。git
根據github裏面ruby-nats的日誌顯示在11年Derek實現了Ruby版本的NATS服務器以及對應的客戶端。而後在12年底,姑且認爲是13年Derek又用Golang將服務器重寫了一遍,並最終發現其效果更好,因而如今慢慢將Ruby版本的服務器淘汰了,如今官網也只維護一個Golang版本的服務器,也就是咱們這裏的gnatsd。github
NATS服務器:用Golang語言開發,發行版包括二進制發佈包和Docker鏡像。golang
NATS客戶端:包含了多種語言的客戶端。瀏覽器
官方提供的客戶端ruby
Go client: https://github.com/nats-io/go-natsbash
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 文檔。
三、NATS的設計目標
NATS的設計原則是:高性能、可伸縮能力、易於使用,基於這些原則,NATS的設計目標包括:
1)高性能(fast)
2)一直可用(dial tone)
3)極度輕量級(small footprint)
4)最多交付一次(fire and forget,消息發送後無論)
5)支持多種消息通訊模型和用例場景(flexible)
四、NATS應用場景
NATS理想的使用場景有:
1)尋址、發現
2)命令和控制(控制面板)
3)負載均衡
4)多路可伸縮能力
5)定位透明
6)容錯
NATS設計哲學認爲,高質量的QoS應該在客戶端構建,故只創建了請求-應答,不提供:
1)持久化
2)事務處理
3)加強的交付模式 4)企業級隊列