帶你認識開源消息隊列

國內開源項目實在令人敬佩,RocketMQ在Apache中順利孵化,那麼什麼是消息隊列,使用什麼場景下?先看下本文的目錄:

  1. 消息隊列使用場景

  2. 常見的消息隊列有哪些

  3. Topic為何物

  4. 分區為何物

1. 消息隊列使用場景

使用消息隊列具體能做什麼呢?

主題訂閱、消息優先級、消息持久化、消息的可靠投遞、分佈式事務、異構系統對接整合。

帶你認識開源消息隊列

消息隊列作用,來自阿里的雲棲社區

  1. 對異構系統的整合,例如使用不同開發語言的系統之間的通信。

  2. 應用和應用之間的松耦合。

  3. 用做事件通知,作為事件驅動架構、複雜事件架構模型裡面的backbone。

  4. 數據複製通道,這個有很多比較典型的應用場景,比如模擬MySQL的binlog解析,將數據的變更封裝為消息,進而複製到遠端的另外一個數據源。

  5. 與流計算引擎的整合,像和Apache Storm、Spark、Flink等框架進行整合。

2. 常見的消息隊列有哪些,各有哪些優勢,如何選擇?

常見的消息隊列有kafka、RocketMQ、RabbitMQ、ActiveMQ

Kafka

Kafka是LinkedIn開源的分佈式發佈-訂閱消息系統,目前歸屬於Apache定級項目。Kafka主要特點是基於Pull的模式來處理消息消費,追求高吞吐量,一開始的目的就是用於日誌收集和傳輸。0.8版本開始支持複製,不支持事務,對消息的重複、丟失、錯誤沒有嚴格要求,適合產生大量數據的互聯網服務的數據收集業務。kafka具有百萬級的TPS,但在過多的topic以及消息比較大的情況下,TPS就不行了,大的吞吐量得益於kafka的batch,如果關閉了,也就有3W左右的TPS。但人家處理大數據,大多處於離線和半離線,對丟數據不敏感。Kafka在小消息性能傳輸上是性能最佳的一個。

RabbitMQ

RabbitMQ是使用Erlang語言開發的開源消息隊列系統,基於AMQP協議來實現。AMQP的主要特徵是面向消息、隊列、路由(包括點對點和發佈/訂閱)、

可靠性、安全。AMQP協議更多用在企業系統內,對數據一致性、穩定性和可靠性要求很高的場景,例如銀行,對性能和吞吐量的要求還在其次。

RocketMQ

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

ActiveMQ

作為apache老牌消息隊列,實現了JMS規範並支持多種語言開發,支持多種傳輸協議,例如HTTP,HTTPS,IP多點傳送,SSL,STOMP,TCP,UDP,XMPP等。消息可以持久化,ActiveMQ通過KahaDB提供自己的超快速消息持久方案。總結一句就是:寶刀未老。在性能、可靠、實施上要求不是很苛刻的話,仍可選擇它。

介紹完了,那麼我們怎麼選擇呢?

kafka:Topic不是很多,消息通常比較小,對數據完整性要求不是很嚴苛,通常使用日誌收集、處理離線數據,對丟失又不敏感,選用kafka。

RabbitMQ:不要求高併發,不要求高性能、只求數據可靠、支持事務。選RabbitMQ

RocketMQ:最性能要求較高、高併發、高可用。和kafka相比,可以使用較多的Topic而不影響其性能,對消息的刷盤方式和kafka不同,數據安全性提高了,同時也支持了事務操作。選擇RocketMQ。

ApacheMQ:老牌了,現在很多保守的公司依然在使用,運行仍然良好,但是性能、可靠性、以及高可用方案的實施捉襟見肘。

3. Topic為何物

Topic是消息中間件裡一個重要的概念,每一個Topic代表了一類消息,有了多個Topic,就可以對消息進行歸類與隔離。

可以參照下圖的動物園餵食模型,每一種動物都只能消費相對應的食品。

帶你認識開源消息隊列

分區為何物

Kafka和RocketMQ都是磁盤消息隊列的模式,對於同一個消費組,一個分區只支持一個消費線程來消費消息。過少的分區,會導致消費速度大大落後於消息的生產速度。所以在實際生產環境中,一個Topic會設置成多分區的模式,來支持多個消費者,負載均衡嘛,參照下圖:

帶你認識開源消息隊列

上面內容是對消息隊列整體的overview,根據業務需要,可以選擇一款符合要求的上手即可,後續我打算重點對RocketMQ做使用說明。再次向阿里開源致敬。


分享到:


相關文章: