輕量消息中間件NATS與NSQ的介紹和比較

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)。

參考資料

NAST官方文檔
NSQ官方文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 介紹 最近在研究一些消息中間件,常用的MQ如RabbitMQ,ActiveMQ,Kafka等。NSQ是一個(gè)基...
    aoho閱讀 9,087評(píng)論 1 16
  • 在介紹NATS之前先了解下什么是分布式系統(tǒng)和消息中間件 對(duì)于分布式系統(tǒng)的定義,一直以來我都沒有找到或者想到特別簡練...
    Java大生閱讀 2,590評(píng)論 0 0
  • 一、為什么需要消息系統(tǒng) 1.解耦:允許你獨(dú)立的擴(kuò)展或修改兩邊的處理過程,只要確保它們遵守同樣的接口約束。 2.冗余...
    為你變乖_09e6閱讀 924評(píng)論 0 8
  • 一、入門1、簡介Kafka is a distributed,partitioned,replicated com...
    HxLiang閱讀 3,666評(píng)論 0 9
  • 此番行程:2016.9.30-10.6上海-蘇州-盛澤-杭州-臨安-太倉-上海-鄭州 上海不眠夜, 蘇州匆匆...
    牧心3320閱讀 279評(píng)論 0 2

友情鏈接更多精彩內(nèi)容