RabbitMQ
1.在RabbitMQ中,生產者通過與Broker連接並且建立信道(Channel),將消息發送至交換器(Exchange)。然後根據Exchange 的類型,將消息路由到指定隊列。
2.消費者通過與Broker連接並且建立信道(Channel),消費隊列消息。
3.關鍵字
channel: 信道,一個連接內的邏輯區分。
routeKey: 路由key 與 bindKey 相對應
Exchange: 可以視爲一個名稱與隊列綁定的列表
Queue: 隊列
4.在RabbitMQ中,一個隊列就包含了所有的消息。
RocketMQ
1.在RocketMQ中,創建Topic是需要指定名稱和隊列的數量(默認4個隊列)。當生成者發佈消息到broker時,客戶端會根據指定策略,將消息發送的指定隊列。Broker收到消息之後,會將消息寫入commitLog & consumeQueue,並根據刷盤策略落地。
2.消費者會根據指定策略,被分配的不同的隊列中進行消費(一個隊列只能被同一個消費組中的一個消費者消費),並在消費完成後提交消費位移。
3.這裏關鍵字是
Topic:主題
Queue:隊列
消費位移
4.在RocketMQ中,所有隊列的並集就是消息總和。
Kafka
1.在Kafka中,創建Topic是需要指定名稱和分區的數量。當生成者發佈消息到broker時,客戶端會根據指定策略,將消息發送的指定分區。Broker收到消息之後,會將消息寫入.log & .index & .timeIndex ,並根據刷盤策略落地。
2.消費者會根據指定策略,被分配的不同的分區中進行消費(一個分區只能被同一個消費組中的一個消費者消費),並在消費完成後提交消費位移。
3.這裏關鍵字是
Topic:主題
Partition:分區
消費位移
4.在Kafka中,所有分區的並集就是消息總和。
總結
1.RabbitMQ 、RocketMQ 和 Kafka 在存儲消息的模式存在區別。RabbitMQ是典型的內存式堆積(不是絕對的,當內存不足時,會出現換頁現象),而 RocketMQ 與 Kafka 是磁盤式堆積。一般情況下磁盤的空間都遠大於內存,所有相對而言,RocketMQ 和 Kafka 的消息堆積能力更強。
2.概念的區分。
RabbitMQ: Exchange、Queue
RocketMQ: Topic、MessageQueue
Kafka: Topic、Partition
3.數據集合
RabbitMQ 每個隊列擁有全部數據
RocketMQ 隊列的並集爲全部數據
Kafka 分區的並集爲全部數據
4.日誌存儲的區別
RabbitMQ 消息存儲在內存
RocketMQ 消息存儲在一個日誌文件,相應隊列只存儲對應的消息偏移量
Kafka 消息分佈存儲在不同的分區,每個分區包含日誌文件,偏移量文件及時間偏移量文件。
參考
1.狸貓技術窩 RocketMQ系列
2.《深入理解Kafka:核心設計與實踐原理》
3.《RabbitMQ實戰》