消息隊列
一、概念
- 消息隊列(MQ):一種異步通信機制,通過“消息”的形式讓不同系統或模塊解耦
- 核心思想:發送方(生產者Producer)只負責發送消息,接收方(消費者Consumer)只負責消費消息,兩者之間通過隊列(Broker)傳遞消息
- 優勢:
- 系統解耦
- 異步處理,提高性能
- 削峰填谷(流量削峰,平穩處理高并發請求)
- 可靠通信(保證消息送達和消費)
二、底層實現原理
1. 基礎模型
- Producer(生產者):發送消息的程序/服務
- Broker(消息中間件):消息存儲與轉發的核心
- Consumer(消費者):接收并處理消息的程序
- Queue / Topic:
- Queue(點對點,P2P):消息只會被一個消費者接收
- Topic(發布/訂閱,Pub/Sub):一個消息可以被多個消費者接收
2. 底層關鍵機制
- 存儲機制:磁盤順序寫(提高吞吐量)+ 內存緩存(加速訪問)
- 傳輸協議:TCP / HTTP / 自定義協議(Kafka使用TCP + 自定義協議)
- 消息投遞:支持同步投遞、異步投遞、批量投遞
- 可靠性保障:消息確認(ACK)、重試機制、持久化存儲
三、各類MQ特點
1. Kafka
-
定位:吞吐量高的分布式消息隊列 & 流處理平臺
-
底層實現:
- 順序寫磁盤 + 零拷貝(高性能I/O)
- 分區(Partition) + 副本(Replica)保證擴展性與高可用
- 消費者通過offset拉取消息,自行維護消費進度
-
特點:
- 高吞吐量,適合大數據場景
- 保證消息順序(分區內有序)
- 不支持事務(0.11之后有支持,但是比較重)
-
應用場景:
- 日志收集系統(ELK、日志聚合)
- 大數據實時流處理(Flink、Spark Steaming)
- 高并發訂單 / 交易消息處理
2. RabbitMQ
- 定位:功能最強大、協議最完善的消息中間件
- 消息中間件:包括消息隊列、路由、持久化、事務、確認機制、協議支持等功能
- 底層實現:
- 基于Erlang開發
- 使用AMQP協議(Advanced Message Queuing Protocol)
- 支持消息路由(Exchange)+ 隊列(Queue)
- 特點:
- 強調可靠行,強一致性(消息確認機制(ACK)、持久化、事務支持)
- 路由靈活(Direct、Topic、Fanout、Headers)
- 吞吐量相對Kafka低
- 應用場景:
- 電商訂單系統(下單—>扣庫存—>發貨)
- 任務異步執行(郵箱發送、短信推送)
- 金融系統需要強一致性的場景
3. RocketMQ
- 定位:阿里巴巴開源的高可用、高可靠分布式MQ
- 底層實現:
- 基于java開發
- 消息存儲基于CommitLog + ConsumeQueue索引機制
- 支持順序消息、延遲消息、事務消息
- 特點:
- 支持海量堆積(百萬級消息堆積不影響性能)
- 強調事務信息(保證最終一致性)
- 性能接近Kafka,但支持更多企業級功能
- 應用場景:
- 電商交易系統(保證事務一致性)
- 金融支付消息(高可靠)
- 延遲任務(延遲隊列)
3. Redis
- 定位:緩存數據庫,但也能充當輕量級消息隊列
- 實現方式:
- List(LPUSH / RPOP)實現簡單隊列
- Pub / Sub實現發布訂閱模式
- Redis Stream(5.0+)更強大,支持分組消費、持久化
- 特點:
- 極快,內存級性能
- 可靠性差(宕機可能丟消息,除非持久化)
- 不適合大規模復雜MQ場景
- 應用場景:
- 實時任務隊列(輕量級異步任務)
- 簡單的發布訂閱(聊天室、消息推送)
- 作為Kafka / RabbitMQ的補充