NATS_01:NATS基礎介紹

一、介紹

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服務器與客戶端

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)企業級隊列

相關文章
相關標籤/搜索