NATS
1. 語言
- server:GO
- 官方支持client庫:GO、C等
2. 設計特點
- 高效
- 穩(wěn)定可用
- 輕量
- 支持多種消息策略(at-most-once糠悼,at-least-once)
- 支持多種模式
- streaming下提供可配置的消息持久化
3. 多種消息發(fā)布模式
- 生產-消費(發(fā)布-訂閱)模式
- 一對多
- 兩種策略:
at-most-once(只保證w/tcp的可靠性):消息無接受者時,則該消息丟失耘纱。即消息發(fā)送后不關心是否有接收因块。該策略以降低可靠性換取了性能(吞吐量)±常可靠性由使用者自行設計保證。
at-least-once:在消息可靠性要求更高的場合猩系,使用nats streaming媚送。監(jiān)控消息是否到達每一個訂閱者。降低性能(吞吐量)換取可靠性寇甸。
- 請求-響應模式
- 點對點/一對多塘偎。
- 發(fā)布者發(fā)布消息需要收到響應。接受者可提前將響應放入“信箱”中拿霉。發(fā)布者只接收第一個響應吟秩。(如何配置一對多模型接收多個響應?)
- 隊列訂閱與協(xié)同工作
- 訂閱的不是主題绽淘,而是隊列涵防。是一種負載均衡和容災策略。
- 隊列中每個消息沪铭,隨機發(fā)給一個訂閱者壮池。訂閱者數量可隨時增減。 (具體如何分配合適的訂閱者杀怠?)
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. 小結
nats輕量易用橙依,可完成消息傳輸的基本功能,具有消息確認機制和持久化接口硕旗。不足之處在于消息確認管理和持久化具體方法需要用戶自行實現窗骑。總的來說卵渴,nats提供的是最基本的功能慧域。消息由訂閱者創(chuàng)建,默認大小限制1MB
NSQ
1. 語言
- 開發(fā)語言 go
- client支持語言go,c++(部分支持)等
2. 設計特點
- 支持拓撲浪读,實現高可用性并消除SPOF
- 解決了對更強大的消息傳遞可靠性的需求
- 限制單個進程的內存占用(通過將某些消息保存到磁盤)
- 大大簡化了生產者和消費者的配置要求
- 提供簡單的升級途徑
- 提高效率
3. 組件及概念
- nsqd 每個host上有一個nsqd昔榴。包含一個或多個消息流即topic,每個topic可以有多個channel碘橘,各channel是該topic相互獨立的隊列互订。生產者通過nsqd廣播生產的消息。
- nsqlookupd 服務發(fā)現輔助進程痘拆。消費者通過nsqlookupd找到關心topics所在的host仰禽,channel等信息,與nsqd直接通信纺蛆。nsqlookupd通過tcp與各nsqd連接吐葵。
- nsqadmin 基于web的可視化集群監(jiān)控和管理服務。
4. 可靠性機制
- 消息傳輸采用 at-least-once
- 協(xié)議保證: nsqd 發(fā)送消息桥氏,并暫存温峭;client響應消息;如果nsqd未收到響應字支,則消息自動重排列(凤藏?)
- 缺陷:nsqd出錯,則會丟失該nsqd暫存的消息堕伪。(可一定程度配置隊列的持久化揖庄,即限制內存中消息的數量)
5. 部署/使用
例
啟動nsqlookupd
nsqlookupd
啟動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
后臺管理
nsqadmin --lookupd-http-address=127.0.0.1:4161
6. 小結
nsq也具有輕量易用的特點,通過服務發(fā)現構建訂閱關系欠雌,具有完善的消息確認機制蹄梢,以及直接可用的一定程度持久化措施。不足之處在于各節(jié)點定位對稱富俄,負載不平衡時需要其他策略進行處理检号。而且直接由生產者和消費者進行通信,在通信量大時網絡資源消耗量大(重復建立可靠連接)蛙酪。
NATS與NSQ的比較
在通信規(guī)模不大的場景下齐苛,使用NSQ可以發(fā)揮使用簡潔(nsqd不用可見其他nsqd)和可靠的確認機制,但需要注意nsqd駐留內存的部分消息桂塞,可能在進程失效時丟失凹蜂。需要考慮負載均衡或大規(guī)模通信量的情況下,采用NATS更為適合阁危,但其消息傳輸的持久化和可靠性需要自行增加策略和實現玛痊。