常用消息隊列對比和選擇參考和消息隊列認知

消息隊列之常用協議

AMQP

  • AMQP即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標準高級消息隊列協議,
  • 是應用層協議的一個開放標準,為面向消息的中間件設計。基於此協議的客戶端與消息中間件可傳遞消息,並
  • 不受客戶端/中間件不同產品,不同開發語言等條件的限制。
  • 優點:可靠、通用

MQTT協議

  • MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協
  • 議,有可能成為物聯網的重要組成部分。該協議支持所有平臺,幾乎可以把所有聯網物品和外部連接起來,
  • 被用來當做傳感器和致動器(比如通過Twitter讓房屋聯網)的通信協議。
  • 優點:格式簡潔、佔用帶寬小、移動端通信、PUSH、嵌入式系統

STOMP協議

  • STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息協議,是一種為MOM(Message Oriented Middleware,面向消息的中間件設計的簡單文本協議。STOMP提供一個可互操作的連接格式,允許客戶端與任意STOMP消息代理(Broker)進行交互。
  • 優點:命令模式(非topic\queue模式)

XMPP協議

  • XMPP(可擴展消息處理現場協議,Extensible Messaging and Presence Protocol)是基於可擴展標記語言(XML)的協議,多用於即時消息(IM)以及在線現場探測。適用於服務器之間的準即時操作。核心是基於XML流傳輸,這個協議可能最終允許因特網用戶向因特網上的其他任何人發送即時消息,即使其操作系統和瀏覽器不同。
  • 優點:通用公開、兼容性強、可擴展、安全性高,但XML編碼格式佔用帶寬大
  • 其他基於TCP/IP自定義的協議
  • 有些特殊框架(如:redis、kafka、zeroMq等)根據自身需要未嚴格遵循MQ規範,而是基於TCP\IP自行封裝了一套協議,通過網絡socket接口進行傳輸,實現了MQ的功能。

消息隊列之模型

  1. Pub/Sub發佈訂閱(廣播):使用topic作為通信載體
  2. PTP點對點:使用queue作為通信載體

消息隊列的組成模塊

  • Broker:消息服務器,作為server提供消息核心服務
  • Producer:消息生產者,業務的發起方,負責生產消息傳輸給broker
  • Consumer:消息消費者,業務的處理方,負責從broker獲取消息並進行業務邏輯處理
  • Topic:主題,發佈訂閱模式下的消息統一彙集地,不同生產者向topic發送消息,由MQ服務器分發到不同的訂閱者,實現消息的廣播
  • Queue:隊列,PTP模式下,特定生產者向特定queue發送消息,消費者訂閱特定的queue完成指定消息的接收
  • Message:消息體,根據不同通信協議定義的固定格式進行編碼的數據包,來封裝業務數據,實現消息的傳輸

常用消息隊列介紹

本部分主要介紹四種常用的消息隊列(RabbitMQ/ActiveMQ/RocketMQ/Kafka)的主要特性、優點、缺點。

RabbitMQ

RabbitMQ 2007年發佈,是一個在AMQP(高級消息隊列協議)基礎上完成的,可複用的企業消息系統,是當前最主流的消息中間件之一。

主要特性:

  1. 可靠性: 提供了多種技術可以讓你在性能和可靠性之間進行權衡。這些技術包括持久性機制、投遞確認、發佈者證實和高可用性機制;
  2. 靈活的路由: 消息在到達隊列前是通過交換機進行路由的。RabbitMQ為典型的路由邏輯提供了多種內置交換機類型。如果你有更復雜的路由需求,可以將這些交換機組合起來使用,你甚至可以實現自己的交換機類型,並且當做RabbitMQ的插件來使用;
  3. 消息集群:在相同局域網中的多個RabbitMQ服務器可以聚合在一起,作為一個獨立的邏輯代理來使用;
  4. 隊列高可用:隊列可以在集群中的機器上進行鏡像,以確保在硬件問題下還保證消息安全;
  5. 多種協議的支持:支持多種消息隊列協議;
  6. 服務器端用Erlang語言編寫,支持只要是你能想到的所有編程語言;
  7. 管理界面: RabbitMQ有一個易用的用戶界面,使得用戶可以監控和管理消息Broker的許多方面;
  8. 跟蹤機制:如果消息異常,RabbitMQ提供消息跟蹤機制,使用者可以找出發生了什麼;
  9. 插件機制:提供了許多插件,來從多方面進行擴展,也可以編寫自己的插件;

使用RabbitMQ需要:

  • ErLang語言包
  • RabbitMQ安裝包

RabbitMQ可以運行在Erlang語言所支持的平臺之上:

Solaris

BSD

Linux

MacOSX

TRU64

Windows NT/2000/XP/Vista/Windows 7/Windows 8

Windows Server 2003/2008/2012

Windows 95, 98

VxWorks

優點:

  1. 由於erlang語言的特性,mq 性能較好,高併發;
  2. 健壯、穩定、易用、跨平臺、支持多種語言、文檔齊全;
  3. 有消息確認機制和持久化機制,可靠性高;
  4. 高度可定製的路由;
  5. 管理界面較豐富,在互聯網公司也有較大規模的應用;
  6. 社區活躍度高;

缺點:

  1. 儘管結合erlang語言本身的併發優勢,性能較好,但是不利於做二次開發和維護;
  2. 實現了代理架構,意味著消息在發送到客戶端之前可以在中央節點上排隊。此特性使得RabbitMQ易於使用和部署,但是使得其運行速度較慢,因為中央節點增加了延遲,消息封裝後也比較大;
  3. 需要學習比較複雜的接口和協議,學習和維護成本較高;

ActiveMQ

ActiveMQ是由Apache出品,ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規範的 JMS Provider實現。它非常快速,支持多種語言的客戶端和協議,而且可以非常容易的嵌入到企業的應用環境中,並有許多高級功能。

主要特性:

  1. 服從 JMS 規範:JMS 規範提供了良好的標準和保證,包括:同步或異步的消息分發,一次和僅一次的消息分發,消息接收和訂閱等等。遵從 JMS 規範的好處在於,不論使用什麼 JMS 實現提供者,這些基礎特性都是可用的;
  2. 連接性:ActiveMQ 提供了廣泛的連接選項,支持的協議有:HTTP/S,IP 多播,SSL,STOMP,TCP,UDP,XMPP等等。對眾多協議的支持讓 ActiveMQ 擁有了很好的靈活性。
  3. 支持的協議種類多:OpenWire、STOMP、REST、XMPP、AMQP ;
  4. 持久化插件和安全插件:ActiveMQ 提供了多種持久化選擇。而且,ActiveMQ 的安全性也可以完全依據用戶需求進行自定義鑑權和授權;
  5. 支持的客戶端語言種類多:除了 Java 之外,還有:C/C++,.NET,Perl,PHP,Python,Ruby;
  6. 代理集群:多個 ActiveMQ 代理可以組成一個集群來提供服務;
  7. 異常簡單的管理:ActiveMQ 是以開發者思維被設計的。所以,它並不需要專門的管理員,因為它提供了簡單又使用的管理特性。有很多中方法可以監控 ActiveMQ 不同層面的數據,包括使用在 JConsole 或者 ActiveMQ 的Web Console 中使用 JMX,通過處理 JMX 的告警消息,通過使用命令行腳本,甚至可以通過監控各種類型的日誌。

使用ActiveMQ需要:

  • Java JDK
  • ActiveMQ安裝包

ActiveMQ可以運行在Java語言所支持的平臺之上。

優點:

  1. 跨平臺(JAVA編寫與平臺無關有,ActiveMQ幾乎可以運行在任何的JVM上)
  2. 可以用JDBC:可以將數據持久化到數據庫。雖然使用JDBC會降低ActiveMQ的性能,但是數據庫一直都是開發人員最熟悉的存儲介質。將消息存到數據庫,看得見摸得著。而且公司有專門的DBA去對數據庫進行調優,主從分離;
  3. 支持JMS :支持JMS的統一接口;
  4. 支持自動重連;
  5. 有安全機制:支持基於shiro,jaas等多種安全配置機制,可以對Queue/Topic進行認證和授權。
  6. 監控完善:擁有完善的監控,包括Web Console,JMX,Shell命令行,Jolokia的REST API;
  7. 界面友善:提供的Web Console可以滿足大部分情況,還有很多第三方的組件可以使用,如hawtio;
  8. 缺點:
  9. 社區活躍度不及RabbitMQ高;
  10. 根據其他用戶反饋,會出莫名其妙的問題,會丟失消息;
  11. 目前重心放到activemq6.0產品-apollo,對5.x的維護較少;
  12. 不適合用於上千個隊列的應用場景;

RocketMQ

RocketMQ出自 阿里公司的開源產品,用 Java 語言實現,在設計時參考了 Kafka,並做出了自己的一些改進,消息可靠性上比 Kafka 更好。RocketMQ在阿里集團被廣泛應用在訂單,交易,充值,流計算,消息推送,日誌流式處理,binglog分發等場景。

主要特性:

  1. 是一個隊列模型的消息中間件,具有高性能、高可靠、高實時、分佈式特點;
  2. Producer、Consumer、隊列都可以分佈式;
  3. Producer向一些隊列輪流發送消息,隊列集合稱為Topic,Consumer如果做廣播消費,則一個consumer實例消費這個Topic對應的所有隊列,如果做集群消費,則多個Consumer實例平均消費這個topic對應的隊列集合;
  4. 能夠保證嚴格的消息順序;
  5. 提供豐富的消息拉取模式;
  6. 高效的訂閱者水平擴展能力;
  7. 實時的消息訂閱機制;
  8. 億級消息堆積能力;
  9. 較少的依賴;

使用RocketMQ需要:

  • Java JDK
  • 安裝git、Maven
  • RocketMQ安裝包

RocketMQ可以運行在Java語言所支持的平臺之上。

優點:

  1. 單機支持 1 萬以上持久化隊列
  2. RocketMQ 的所有消息都是持久化的,先寫入系統 PAGECACHE,然後刷盤,可以保證內存與磁盤都有一份數據,
  3. 訪問時,直接從內存讀取。
  4. 模型簡單,接口易用(JMS 的接口很多場合並不太實用);
  5. 性能非常好,可以大量堆積消息在broker中;
  6. 支持多種消費,包括集群消費、廣播消費等。
  7. 各個環節分佈式擴展設計,主從HA;
  8. 開發度較活躍,版本更新很快。

缺點:

支持的客戶端語言不多,目前是java及c++,其中c++不成熟;

RocketMQ社區關注度及成熟度也不及前兩者;

沒有web管理界面,提供了一個CLI(命令行界面)管理工具帶來查詢、管理和診斷各種問題;

沒有在 mq 核心中去實現JMS等接口;

Kafka

Apache Kafka是一個分佈式消息發佈訂閱系統。它最初由LinkedIn公司基於獨特的設計實現為一個分佈式的提交日誌系統( a distributed commit log),,之後成為Apache項目的一部分。Kafka系統快速、可擴展並且可持久化。它的分區特性,可複製和可容錯都是其不錯的特性。

主要特性:

  1. 快速持久化,可以在O(1)的系統開銷下進行消息持久化;
  2. 高吞吐,在一臺普通的服務器上既可以達到10W/s的吞吐速率;
  3. .完全的分佈式系統,Broker、Producer、Consumer都原生自動支持分佈式,自動實現負載均衡;
  4. 支持同步和異步複製兩種HA;
  5. 支持數據批量發送和拉取;
  6. zero-copy:減少IO操作步驟;
  7. 數據遷移、擴容對用戶透明;
  8. 無需停機即可擴展機器;
  9. 其他特性:嚴格的消息順序、豐富的消息拉取模型、高效訂閱者水平擴展、實時的消息訂閱、億級的消息堆積能力、定期刪除機制;

使用Kafka需要:

  • Java JDK
  • Kafka安裝包

優點:

  1. 客戶端語言豐富,支持java、.net、php、ruby、python、go等多種語言;
  2. 性能卓越,單機寫入TPS約在百萬條/秒,消息大小10個字節;
  3. 提供完全分佈式架構, 並有replica機制, 擁有較高的可用性和可靠性, 理論上支持消息無限堆積;
  4. 支持批量操作;
  5. 消費者採用Pull方式獲取消息, 消息有序, 通過控制能夠保證所有消息被消費且僅被消費一次;
  6. 有優秀的第三方Kafka Web管理界面Kafka-Manager;
  7. 在日誌領域比較成熟,被多家公司和多個開源項目使用;

缺點:

  1. Kafka單機超過64個隊列/分區,Load會發生明顯的飆高現象,隊列越多,load越高,發送消息響應時間變長
  2. 使用短輪詢方式,實時性取決於輪詢間隔時間;
  3. 消費失敗不支持重試;
  4. 支持消息順序,但是一臺代理宕機後,就會產生消息亂序;
  5. 社區更新較慢;

RabbitMQ/ActiveMQ/RocketMQ/Kafka對比

這裡列舉了上述四種消息隊列的差異對比:

常用消息隊列對比和選擇參考和消息隊列認知

結論:

Kafka在於分佈式架構,RabbitMQ基於AMQP協議來實現,RocketMQ/思路來源於kafka,改成了主從結構,在事務性可靠性方面做了優化。廣泛來說,電商、金融等對事務性要求很高的,可以考慮RabbitMQ和RocketMQ,對性能要求高的可考慮Kafka。

參考原文:

http://www.cnblogs.com/yangk5636/p/9232183.html

https://www.cnblogs.com/javalyy/p/8856731.html


分享到:


相關文章: