NATS
1. 語言
- server:GO
- 官方支持client庫:GO、C等
2. 設(shè)計(jì)特點(diǎn)
- 高效
- 穩(wěn)定可用
- 輕量
- 支持多種消息策略(at-most-once,at-least-once)
- 支持多種模式
- streaming下提供可配置的消息持久化
3. 多種消息發(fā)布模式
- 生產(chǎn)-消費(fèi)(發(fā)布-訂閱)模式
- 一對(duì)多
- 兩種策略:
at-most-once(只保證w/tcp的可靠性):消息無接受者時(shí),則該消息丟失。即消息發(fā)送后不關(guān)心是否有接收。該策略以降低可靠性換取了性能(吞吐量)。可靠性由使用者自行設(shè)計(jì)保證。
at-least-once:在消息可靠性要求更高的場合,使用nats streaming。監(jiān)控消息是否到達(dá)每一個(gè)訂閱者。降低性能(吞吐量)換取可靠性。
- 請求-響應(yīng)模式
- 點(diǎn)對(duì)點(diǎn)/一對(duì)多。
- 發(fā)布者發(fā)布消息需要收到響應(yīng)。接受者可提前將響應(yīng)放入“信箱”中。發(fā)布者只接收第一個(gè)響應(yīng)。(如何配置一對(duì)多模型接收多個(gè)響應(yīng)?)
- 隊(duì)列訂閱與協(xié)同工作
- 訂閱的不是主題,而是隊(duì)列。是一種負(fù)載均衡和容災(zāi)策略。
- 隊(duì)列中每個(gè)消息,隨機(jī)發(fā)給一個(gè)訂閱者。訂閱者數(shù)量可隨時(shí)增減。 (具體如何分配合適的訂閱者?)
4. 包含組件
- nats-server at-most-once策略下的server
- nats-streaming-server at-least-once策略下的server
- nats-req
- nats-rply
5. 部署
例
nats-server -p 4222 -cluster nats://localhost:6222 -routes nats://localhost:6222,nats://localhost:6333
client監(jiān)聽端口 4222,集群監(jiān)聽端口6222,所有集群通信端口6222(本server忽略)、6333
6. 小結(jié)
nats輕量易用,可完成消息傳輸?shù)幕竟δ?,具有消息確認(rèn)機(jī)制和持久化接口。不足之處在于消息確認(rèn)管理和持久化具體方法需要用戶自行實(shí)現(xiàn)??偟膩碚f,nats提供的是最基本的功能。消息由訂閱者創(chuàng)建,默認(rèn)大小限制1MB
NSQ
1. 語言
- 開發(fā)語言 go
- client支持語言go,c++(部分支持)等
2. 設(shè)計(jì)特點(diǎn)
- 支持拓?fù)?,?shí)現(xiàn)高可用性并消除SPOF
- 解決了對(duì)更強(qiáng)大的消息傳遞可靠性的需求
- 限制單個(gè)進(jìn)程的內(nèi)存占用(通過將某些消息保存到磁盤)
- 大大簡化了生產(chǎn)者和消費(fèi)者的配置要求
- 提供簡單的升級(jí)途徑
- 提高效率
3. 組件及概念
- nsqd 每個(gè)host上有一個(gè)nsqd。包含一個(gè)或多個(gè)消息流即topic,每個(gè)topic可以有多個(gè)channel,各channel是該topic相互獨(dú)立的隊(duì)列。生產(chǎn)者通過nsqd廣播生產(chǎn)的消息。
- nsqlookupd 服務(wù)發(fā)現(xiàn)輔助進(jìn)程。消費(fèi)者通過nsqlookupd找到關(guān)心topics所在的host,channel等信息,與nsqd直接通信。nsqlookupd通過tcp與各nsqd連接。
- nsqadmin 基于web的可視化集群監(jiān)控和管理服務(wù)。
4. 可靠性機(jī)制
- 消息傳輸采用 at-least-once
- 協(xié)議保證: nsqd 發(fā)送消息,并暫存;client響應(yīng)消息;如果nsqd未收到響應(yīng),則消息自動(dòng)重排列(?)
- 缺陷:nsqd出錯(cuò),則會(huì)丟失該nsqd暫存的消息。(可一定程度配置隊(duì)列的持久化,即限制內(nèi)存中消息的數(shù)量)
5. 部署/使用
例
啟動(dòng)nsqlookupd
nsqlookupd
啟動(dòng)nsqd
nsqd --lookupd-tcp-address=127.0.0.1:4160
producer發(fā)布消息
curl -d 'hello world 1' 'http://127.0.0.1:4151/pub?topic=test'
consumer接收消息
nsq_to_file --topic=test --output-dir=/tmp --lookupd-http-address=127.0.0.1:4161
后臺(tái)管理
nsqadmin --lookupd-http-address=127.0.0.1:4161
6. 小結(jié)
nsq也具有輕量易用的特點(diǎn),通過服務(wù)發(fā)現(xiàn)構(gòu)建訂閱關(guān)系,具有完善的消息確認(rèn)機(jī)制,以及直接可用的一定程度持久化措施。不足之處在于各節(jié)點(diǎn)定位對(duì)稱,負(fù)載不平衡時(shí)需要其他策略進(jìn)行處理。而且直接由生產(chǎn)者和消費(fèi)者進(jìn)行通信,在通信量大時(shí)網(wǎng)絡(luò)資源消耗量大(重復(fù)建立可靠連接)。
NATS與NSQ的比較
在通信規(guī)模不大的場景下,使用NSQ可以發(fā)揮使用簡潔(nsqd不用可見其他nsqd)和可靠的確認(rèn)機(jī)制,但需要注意nsqd駐留內(nèi)存的部分消息,可能在進(jìn)程失效時(shí)丟失。需要考慮負(fù)載均衡或大規(guī)模通信量的情況下,采用NATS更為適合,但其消息傳輸?shù)某志没涂煽啃孕枰孕性黾硬呗院蛯?shí)現(xiàn)。