現(xiàn)在Message Queue有多種選擇仁堪,比如Java的Kafaka/ActiveMQ阶捆、Erlang的RabbitMQ倦卖、Golang的NSQ以及這里要說的gnatcd。
1. NATS與gnatcd
NATS is Open Source. Performant. Simple. Scalable.A central nervous system for modern, reliable and scalable cloud and distributed systems.
--http://nats.io/
按照其官網(wǎng)的說法粥航,NATS是一個(gè)開源的、高性能的、簡(jiǎn)潔的焕盟、靈活的 適用于現(xiàn)代的可靠靈活的云和分布式系統(tǒng)的中樞系統(tǒng)。 說的很玄乎娱挨,實(shí)際上就是一個(gè)分布式
的消息隊(duì)列系統(tǒng)邦危,支持PubSub/ReqRsp 模型。其最初由Apcera領(lǐng)導(dǎo)開發(fā)毡熏,并實(shí)現(xiàn)了Ruby版本的服務(wù)器和客戶端坦敌,其主要作者Derek Collison自稱做了20多年的MQ,并經(jīng)歷過TIBOC、Rendezvous狱窘、EMC公司杜顺,這里有他自己的reddit回答。
根據(jù)github里面ruby-nats的日志顯示在11年Derek實(shí)現(xiàn)了Ruby版本
的NATS服務(wù)器以及對(duì)應(yīng)的客戶端蘸炸。然后在12年末躬络,Derek又用Golang將服務(wù)器重寫了一遍,并最終發(fā)現(xiàn)其效果更好搭儒,于是現(xiàn)在慢慢將Ruby版本的服務(wù)器淘汰了穷当,現(xiàn)在
官網(wǎng)也只維護(hù)一個(gè)Golang版本的服務(wù)器,也就是我們這里的gnatcd淹禾。
NATS provides a lightweight server that is written in the Go programming language. Apcera actively maintains and supports the NATS server source code, binary distributions, and Docker image.
-- http://nats.io/documentation/
gnatcd根據(jù)NATS說法馁菜,會(huì)由Apcera維護(hù),并提供源碼铃岔、二進(jìn)制文件以及Docker鏡像文件汪疮。
2. NATS組成以及支持的內(nèi)容
NATS主要由Golang寫的服務(wù)器“gnatsd”和一系列的客戶端SDK組成,客戶端有官方維護(hù)Golang
毁习、Node.js
智嚷、Ruby
、Java
蜓洪、C
纤勒、C#
以及Nginx C
版本,除此之外還有社區(qū)貢獻(xiàn)的Spring
隆檀、Lua
摇天、PHP
、Python
恐仑、Scala
泉坐、Haskell
版本,基本覆蓋了主流語言裳仆。
客戶端和服務(wù)器之間通過一套本文協(xié)議進(jìn)行通訊(想想Redis也是文本協(xié)議)腕让,因此可以和Redis一樣可以通過Telnet進(jìn)行調(diào)試,也因此只要按照文檔中的描述歧斟,來
實(shí)現(xiàn)一套客戶端(想想Redis那么多的客戶端)纯丸。
具體的協(xié)議羅列在官方手冊(cè)中,主要分成:
操作命令 | 由誰發(fā)送 | 描述 |
---|---|---|
INFO | Server | 當(dāng)TCP握手完成后,由服務(wù)器發(fā)給客戶端 |
CONNECT | Client | 由客戶端發(fā)送給服務(wù)器静袖,帶上連接的必要信息 |
PUB | Client | 客戶端發(fā)送一個(gè)發(fā)布消息給服務(wù)器 |
SUB | Client | 客戶端向服務(wù)器訂閱一條消息 |
UNSUB | Client | 客戶端向服務(wù)器取消之前的訂閱 |
MSG | Server | 服務(wù)器發(fā)送訂閱的內(nèi)容給客戶端 |
PING | Both | PING keep-alive 消息 |
PONG | Both | PONG keep-alive 響應(yīng) |
+OK | Server | 在verbose模式下觉鼻,確認(rèn)正確的協(xié)議格式 |
-ERR | Server | 表示協(xié)議錯(cuò)誤,將端口連接 |
NATS實(shí)現(xiàn)了三種模式
- Publish Subscribe
- Request Reply
- Queueing
也就是MessageQueue常見的“發(fā)布訂閱模式”队橙、“請(qǐng)求響應(yīng)模式”以及“消息隊(duì)列模式”坠陈。
3. gnatcd安裝與使用
了解了NATS后萨惑,我們來看怎么進(jìn)行簡(jiǎn)單的使用。gnatcd是用Golang寫的仇矾,因此可以很方便的用go get github.com/nats-io/gnatsd
進(jìn)行安裝庸蔼。如果沒有Golang環(huán)境,也可以在下載界面下載MacOS/Linux二進(jìn)制文件贮匕,甚至Docker鏡像姐仅。客戶端SDK也可以在這里找到下載粗合。
在用"go get”安裝的時(shí)候萍嬉,需要注意的是,gnatcd依賴“golang.org/x/crypto/bcrypt”隙疚,但是這個(gè)地址已經(jīng)被移動(dòng)到Github上了壤追,所以上面的地址"get"不
到源碼,所以需要在你的$GOPATH/golang.org/x目錄下git拖一下crypto的新代碼:https://github.com/golang/crypto.git
mkdir -p $GOPATH/golang.org/x
cd $GOPATH/golang.org/x
git clone https://github.com/golang/crypto.git
然后到get到的gnastd目錄下供屉,執(zhí)行build或者install進(jìn)行編譯:
cd $GOPATH/github.com/nats-io/gnatsd
go build
go install
然后根據(jù)build/install的方始行冰,執(zhí)行g(shù)natsd命令,會(huì)看到
$./gnatsd
[20783] 2016/04/23 23:14:22.850373 [INF] Starting nats-server version 0.8.0.beta
[20783] 2016/04/23 23:14:22.850469 [INF] Listening for client connections on 0.0.0.0:4222
[20783] 2016/04/23 23:14:22.850585 [INF] Server is ready
這樣服務(wù)器就正常運(yùn)行了伶丐。
下面在開兩個(gè)終端悼做,我們用Golang的客戶端nats(https://github.com/nats-io/nats.git)來做個(gè)pub-sub的例子。首先go get github.com/nats-io/nats
進(jìn)行安裝哗魂。
然后分別建立兩個(gè)目錄:
mkdir pub sub
接著分別將https://github.com/nats-io/examples/nats-pub.go復(fù)制到pub目錄肛走,https://github.com/nats-io/examples/nats-sub.go復(fù)制到sub目錄。然后修改這兩個(gè)文件录别,將最開始的:
// +build ignore
刪除后朽色,分別在兩個(gè)目錄下執(zhí)行
go build
現(xiàn)在客戶端就建立好了,這個(gè)時(shí)候先在sub目錄下訂閱一條消息:
./sub -s nats://localhost:4222 -t abc
Listening on [abc]
然后再在pub下面進(jìn)行發(fā)布:
$./pub -s nats://localhost:4222 abc msg_abc
Published [abc] : 'msg_abc'
此時(shí)组题,回望sub那邊:
2016/04/24 14:27:53 [#1] Received on [abc]: 'msg_abc'
這樣也就完成了一次消息的發(fā)布和訂閱了葫男。
4. bechmark
NATS作為一個(gè)既老(2012年就有Ruby版本)又新(2013年的Golang版本)的MessageQueue,和其他同類產(chǎn)品(Kafaka/ActiveMQ/NSQ/RabbitMQ)又有什么優(yōu)勢(shì)呢崔列?來看兩個(gè)benchmar梢褐,第一個(gè)是官方的benchmark
另一個(gè)是bravenewgeek做的一個(gè)Golang MQ對(duì)比,結(jié)果如下:
另外他還做了一個(gè)和其他產(chǎn)品之間的對(duì)比,結(jié)果如下:
總的來說gnats的性能還是毋庸置疑的,主要可能還是要看他的使用場(chǎng)景赵讯。