Kafka、RabbitMQ、RocketMQ常見消息中間件的介紹和對比

在分佈式系統中,我們會廣泛使用各種消息中間件來進行系統間的數據交換,以便於各系統之間實現異步解耦。目前市場上開源的消息中間件有很多:如Kafka、RabbitMQ、RocketMQ等等。

Kafka、RabbitMQ、RocketMQ常見消息中間件的介紹和對比

什麼是消息隊列

在正式介紹和對比Kafka、RabbitMQ、RocketMQ之前,我們來說說什麼是消息隊列(Message queue,簡稱MQ),從字面理解就是一個保存消息的一個容器。那麼我們為何需要這樣一個容器呢?其實就是為了解耦各個系統,我們來舉個例子:

Kafka、RabbitMQ、RocketMQ常見消息中間件的介紹和對比

有這麼一個簡單的場景,系統A負責生成userID,並調用系統B、C。如果系統BC頻繁變化是否需要userID參數,則系統A的代碼就得不斷變化,如果哪天又來了系統DEF……也需要這個參數,則系統A又要加入很多業務邏輯,這樣子各他系統之間就容易產生相互影響,另外大量的系統與A發生交互也容易產生問題。

Kafka、RabbitMQ、RocketMQ常見消息中間件的介紹和對比

加了消息隊列後,A只負責產生userID,至於誰要用這個參數,怎麼用?系統A不管。對這個數據感興趣的系統自己去取用即可,各個系統之間就實現瞭解耦。而且解耦後,整個服務也變成了一個異步的方式,系統A產生數據後,不用依次調用BCD來累計耗時,各系統可以同時來取用消息隊列的數據進行處理,加大吞吐。

消息隊列的特點

Kafka、RabbitMQ、RocketMQ常見消息中間件的介紹和對比

1、先進先出:消息隊列的順序在入隊的時候就基本已經確定了,一般是不需人工干預的。

2、發佈訂閱:發佈訂閱是一種很高效的處理方式,如果不發生阻塞,基本可以當做是同步操作。

3、持久化:持久化確保消息隊列的使用不只是一個部分場景的輔助工具,而是讓消息隊列能像數據庫一樣存儲核心的數據。

4、分佈式:在現在大流量、大數據的使用場景下,支持分佈式的部署,才能被廣泛使用。消息隊列的定位就是一個高性能的中間件。

Kafka、RabbitMQ、RocketMQ介紹

Kafka

Kafka、RabbitMQ、RocketMQ常見消息中間件的介紹和對比

Kafka是LinkedIn開源的分佈式發佈-訂閱消息系統,目前歸屬於Apache頂級項目。Kafka主要為高吞吐量

的訂閱發佈系統而設計,追求速度與持久化。kafka中的消息由鍵、值、時間戳組成,kafka不記錄每個消息被誰使用,只通過偏移量記錄哪些消息是未讀的,kafka中可以指定消費組來實現訂閱發佈的功能。

RabbitMQ

Kafka、RabbitMQ、RocketMQ常見消息中間件的介紹和對比

RabbitMQ是使用Erlang語言開發的開源消息隊列系統,基於AMQP協議來實現。AMQP的主要特徵是面向消息、隊列、路由(包括點對點和發佈/訂閱)、可靠性、安全。AMQP協議更多用在企業系統內,對數據一致性、穩定性和可靠性要求很高的場景,對性能和吞吐量的要求還在其次。

RocketMQ

RocketMQ是阿里開源的消息中間件,它是純Java開發,具有高吞吐量、高可用性、適合大規模分佈式系統應用的特點。RocketMQ思路起源於Kafka,但並不是Kafka的一個Copy,它對消息的可靠傳輸及事務性做了優化,目前在阿里集團被廣泛應用於交易、充值、流計算、消息推送、日誌流式處理、binglog分發等場景。支持的客戶端語言不多,目前是Java及C++,其中C++還不成熟;

Kafka、RabbitMQ、RocketMQ對比

Kafka、RabbitMQ、RocketMQ常見消息中間件的介紹和對比

1、Rabbitmq比kafka可靠,kafka更適合IO高吞吐的處理,比如ELK日誌收集。

2、kafka具有高的吞吐量,內部採用消息的批量處理,zero-copy機制,數據的存儲和獲取是本地磁盤順序批量操作,具有O(1)的複雜度,消息處理的效率很高。rabbitMQ在吞吐量方面稍遜於kafka,他們的出發點不一樣,rabbitMQ支持對消息的可靠的傳遞,支持事務,不支持批量的操作;基於存儲的可靠性的要求存儲可以採用內存或者硬盤。


分享到:


相關文章: