1. 程式人生 > >訊息中介軟體——RabbitMQ(二)各大主流訊息中介軟體綜合對比介紹!

訊息中介軟體——RabbitMQ(二)各大主流訊息中介軟體綜合對比介紹!

前言

訊息佇列已經逐漸成為企業IT系統內部通訊的核心手段。它具有低耦合、可靠投遞、廣播、流量控制、最終一致性等一系列功能,成為非同步RPC的主要手段之一。當今市面上有很多主流的訊息中介軟體,如老牌的ActiveMQ、RabbitMQ,炙手可熱的Kafka,阿里巴巴自主開發RocketMQ等。今天主要來介紹了下幾大主流訊息中介軟體的區別與聯絡。

1. 主流訊息中介軟體介紹——ActiveMQ

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

1.1 特點

  • ActiveMQ是Apache出品,最流行的,能力強勁的開源訊息匯流排,並且它是一個完全支援JMS規範的訊息中介軟體
  • 其豐富的API、多種叢集構建模式使得他成為業界老牌訊息中介軟體,在中小型企業中應用廣泛!
  • MQ衡量指標:服務效能、資料儲存、叢集架構。

ActiveMQ現在用的比較少,因為ActiveMQ相比其他的MQ的效能來說比較一般。現如今高併發、大資料的應用場景隨處可見。如果這時候在MQ的選擇上,那麼ActiveMQ就顯得力不從心了。

衡量一個MQ的指標,主要有三個方面:服務效能、資料儲存、叢集架構
服務效能:ActiveMQ的效能不是特別好,面對超大規模併發時候,總是會出現各種各樣的小問題,比如阻塞,訊息堆積過多,產生一些延遲等等一些問題。
資料儲存:ActiveMQ預設採用KahaDB記憶體儲存方式。也可以採用一些高效能的儲存方式,比如:google的LevelDb 基於內c存的。如果是為了保證訊息的可靠,也可以採用mysql或者oracle資料庫。
叢集架構:ActiveMQ流行那麼多年,與其他元件整合的Api也是十分完善的。如果不是特別大的併發場景下,ActiveMQ也是一個不錯的選擇。因為ActiveMQ的叢集架構模式也是十分好。

1.2 架構模式

Masrer-Slave模式
主備模式,利用Zookeeper進行兩個或多個節點的協調。其中的主節點是對外提供服務的,而另外的從節點啟動著,但是不對外提供服務。當主節點掛掉,利用Zookeeper進行一個高可用的切換,將Salve節點切換成主節點,繼續對外提供服務。

NetWork模式

本質是兩組主備模式的整合,中間用NewWork閘道器,做一個連線配置,就可以實現分散式叢集。

1.3 小結

優點:

  • 跨平臺(JAVA編寫與平臺無關,ActiveMQ幾乎可以執行在任何的JVM上)
  • 可以用JDBC:可以將資料持久化到資料庫。雖然使用JDBC會降低ActiveMQ的效能,但是資料庫一直都是開發人員最熟悉的儲存介質
  • 支援JMS規範:支援JMS規範提供的統一介面
  • 支援自動重連和錯誤重試機制
  • 有安全機制:支援基於shiro,jaas等多種安全配置機制,可以對Queue/Topic進行認證和授權
  • 監控完善:擁有完善的監控,包括WebConsole,JMX,Shell命令列,Jolokia的RESTful API
  • 介面友善:提供的WebConsole可以滿足大部分情況,還有很多第三方的元件可以使用,比如hawtio

缺點:

  • 社群活躍度不及RabbitMQ高
  • 根據其他使用者反饋,會出莫名其妙的問題,會丟失訊息
  • 目前重心放到activemq6.0產品Apollo,對5.x的維護較少
  • 不適合用於上千個佇列的應用場景

2. 主流訊息中介軟體介紹——Kafka

Apache Kafka是一個分散式訊息釋出訂閱系統。它最初由LinkedIn公司基於獨特的設計實現為一個分散式的日誌提交系統(a distributed commit log),之後成為Apache專案的一部分。Kafka效能高效、可擴充套件良好並且可持久化。它的分割槽特性,可複製和可容錯都是其不錯的特性。

2.1 特點

kafka是LinkedIn開源的分散式釋出-定於訊息系統,目前歸屬於Apache頂級專案。Kafka主要特點是給予Pull的模式來處理消費訊息,追求高吞吐量,一開始的目的就是用於日誌收集和傳輸。0.8版本開始支援複製,不支援事務,對訊息的重複、丟失、錯誤沒有嚴格要求,適合產生大量資料的網際網路服務的資料收集業務。這裡可以看出kafka只關注吞吐量。因此,在使用kafka的時候,注意業務是否允許訊息重複、丟失、錯誤等。如果允許的話,kafka是最合適的。因為它的效能是最高的。即使在廉價的伺服器上,也能支援單機每秒100k條以上的資料量。所以說它的效能是非常好的。kafka僅僅使用記憶體進行儲存,只要有足夠的記憶體,就能夠足夠大的吞吐量。因為kafka並沒有在磁碟上進行讀寫。

  • 快速持久化:可以在O(1)的系統開銷下進行訊息持久化;
  • 高吞吐:在一臺普通的伺服器上既可以達到10W/s的吞吐速率;
  • 完全的分散式系統:Broker、Producer和Consumer都原生自動支援分散式,自動實現負載均衡;
  • 支援同步和非同步複製兩種高可用機制;
  • 支援資料批量傳送和拉取;
  • 零拷貝技術(zero-copy):減少IO操作步驟,提高系統吞吐量;
  • 資料遷移、擴容對使用者透明;
  • 無需停機即可擴充套件機器;
  • 其他特性:豐富的訊息拉取模型、高效訂閱者水平擴充套件、實時的訊息訂閱、億級的訊息堆積能力、定期刪除機制

2.2 架構模式

kafka架構模式

主要依賴Zookeeper進行協調管理,每一個kafka可以進行副本複製,也就是資料同步。假如說:有一條資料落在第一個節點上,那麼就會進行repilicate 複製,這樣在執行中每個節點就有一份資料,一共就有三分資料。如果說其中一臺宕機,也能從另外兩個節點中獲取資料。部署方案建議:跨機房部署。即使有一臺機子宕機,在資料上也是沒有問題的。如果在整個地點宕機了。那麼我們的資料也就丟失了。這也是大公司需要考慮的異地災備。當然kafka主要關注效能的,對於資料的可靠性關注並高。

2.3 小結

優點:

  • 客戶端語言豐富:支援Java、.Net、PHP、Ruby、Python、Go等多種語言;
  • 高效能:單機寫入TPS約在100萬條/秒,訊息大小10個位元組;
  • 提供完全分散式架構,並有replica機制,擁有較高的可用性和可靠性,理論上支援訊息無限堆積;
  • 支援批量操作;
  • 消費者採用Pull方式獲取訊息。訊息有序,通過控制能夠保證所有訊息被消費且僅被消費一次;
  • 有優秀的第三方KafkaWeb管理介面Kafka-Manager;
  • 在日誌領域比較成熟,被多家公司和多個開源專案使用。

缺點:

  • Kafka單機超過64個佇列/分割槽時,Load時會發生明顯的飆高現象。佇列越多,負載越高,傳送訊息響應時間變長;
  • 使用短輪詢方式,實時性取決於輪詢間隔時間;
  • 消費失敗不支援重試;
  • 支援訊息順序,但是一臺代理宕機後,就會產生訊息亂序;
  • 社群更新較慢。

3. 主流訊息中介軟體介紹——RocketMQ

RocketMQ是阿里開源的訊息中介軟體,目前也已經孵化為Apache頂級專案。用Java語言實現,在設計時參考了Kafka,並做出了自己的一些改進,訊息可靠性上比Kafka更好。RocketMQ在阿里內部被廣泛應用在訂單,交易,充值,流計算,訊息推送,日誌流式處理,binglog分發等場景。

3.1 特點

核心的特點如下:

  • 保證訊息的順序性,訊息按順序消費。
  • 提供了豐富的拉取和處理模式。
  • 高效的訂閱者,也可以進行水平擴充套件。
  • 承載上億級別的訊息堆積能力。

3.2 架構模式

RocketMQ叢集架構模式
1.Master-Slave(主從)模式
2.雙Master模式。
3.雙主雙從模式。
4.多主多從模式。
5.一主多從模式。
可選方案許多種可供選擇。

等等,參考了許多開源的設方式。

叢集拓撲

阿里覺得Zookeeper效能太低,自己搭建了NameServer,這個NameServer程式碼也十分精簡,一共也就幾百行程式碼。有興趣可以去讀原始碼。

3.3 小結

優點:

  • 單機支援1萬以上持久化佇列;
  • RocketMQ的所有訊息都是持久化的,先寫入系統PAGECACHE,然後刷盤,可以保證記憶體與磁碟都有一份資料,而訪問時,直接從記憶體讀取。
  • 模型簡單,介面易用(JMS的介面很多場合並不太實用);
  • 效能非常好,可以允許大量堆積訊息在Broker中;
  • 支援多種消費模式,包括叢集消費、廣播消費等;
  • 各個環節分散式擴充套件設計,支援主從和高可用;
  • 開發度較活躍,版本更新很快。

缺點:

  • 支援的 客戶端語言不多,目前是Java及C++,其中C++還不成熟
  • 維護RocketMQ需要專業的團隊
  • 商業版收費,有許多功能是不對外提供的。
  • 沒有在MQ核心裡實現JMS等介面

4. 為什麼選擇RabbitMQ?

1.ActiveMQ,效能不是很好,因此在高併發的場景下,直接被pass掉了。它的Api很完善,在中小型網際網路公司可以去使用。
2.kafka,主要強調高效能,如果對業務需要可靠性訊息的投遞的時候。那麼就不能夠選擇kafka了。但是如果做一些日誌收集呢,kafka還是很好的。因為kafka的效能是十分好的。
3.RocketMQ,它的特點非常好。它高效能、滿足可靠性、分散式事物、支援水平擴充套件、上億級別的訊息堆積、主從之間的切換等等。MQ的所有優點它基本都滿足。但是它最大的缺點:商業版收費。因此它有許多功能是不對外提供的。

那麼說完這三種MQ還有沒有其他MQ能夠選擇呢?有的,也是這次學習的MQ——RabbitMQ。

5. 主流訊息中介軟體介紹——RabbitMQ

RabbitMQ於2007年釋出,是一個在AMQP(高階訊息佇列協議)基礎上完成的,可複用的企業訊息系統,是當前最主流的訊息中介軟體之一。

5.1 特點

RabbitMQ是使用Erlang語言開發的開源訊息佇列系統,基於AMQP協議來實現。
AMQP的主要特徵是面向訊息、佇列、路由(包括點對點和釋出/訂閱)、可靠性、安全。
AMQP協議更多用在企業系統內,對資料一致性、穩定性和可靠性要求很高的場景,對效能和吞吐量的要求還在其次。
RabbitMQ的可靠性是非常好的,資料能夠保證百分之百的不丟失。可以使用映象佇列,它的穩定性非常好。所以說在我們網際網路的金融行業。對資料的穩定性和可靠性要求都非常高的情況下,我們都會選擇RabbitMQ。當然沒有kafka效能好,但是要比AvtiveMQ效能要好很多。也可以自己做一些效能的優化。
RabbitMQ可以構建異地雙活架構,包括每一個節點儲存方式可以採用磁碟或者記憶體的方式。

RabbitMQ的叢集架構

圖中說的就是,我們可以採用三個節點作為RabbitMQ的一組叢集,當然可以有許多組。節點與節點之間採用mirror queue。基於這種方式,能夠保證資料百分之百的不丟失。
前端可以去做負載均衡,比如負載均衡元件:HA-proxy ,進行TCP級別的負載。
如果想做一個高可用的話,就需要藉助keepAlived做一個高可用的配置。
比如前端加一個虛擬的VIP,通過VIP路由到指定的負載均衡元件,再有它路由到RabbtMQ的某一個節點。
這就是整個RabbitMQ叢集架構。
能夠實現非常完善,高可用並且效能也十分好,穩定性超強。並且有各種叢集恢復手段。
比如:某一個節點掛了,或者某個磁碟損壞了,它也能進行一個訊息修復。基於這麼多優點,我們一定要把RabbitMQ學好。

6. 對比分析圖

圖片來自網路~

文末

本章節主要簡單介紹了資料庫中樂觀鎖與悲觀鎖的相關知識,後續我們將會繼續介紹資料庫中的其他鎖以及相關知識。例如行鎖、表鎖、死鎖、

歡迎關注個人微信公眾號:Coder程式設計
獲取最新原創技術文章和免費學習資料,更有大量精品思維導圖、面試資料、PMP備考資料等你來領,方便你隨時隨地學習技術知識!
新建了一個qq群:315211365,歡迎大家進群交流一起學習。謝謝了!也可以介紹給身邊有需要的朋友。

文章收錄至
Github: https://github.com/CoderMerlin/coder-programming
Gitee: https://gitee.com/573059382/coder-programming
歡迎關注並star~

參考文章:

https://my.oschina.net/blogByRzc/blog/3012251

《RabbitMQ訊息中介軟體精講》

推薦文章:

RabbitMQ(一)Windows/Linux環境搭建(完整版