文章目錄
- 消息隊列是什么?
- 消息隊列關鍵概念
- 消息隊列優點
- 消息隊列的應用場景
- 異步處理
- 應用解耦
- 流量削峰
- 消息通訊
- 常用消息隊列中間件的對比
消息隊列是什么?
- 消息隊列(Message Queue)是一種用于在軟件系統之間傳遞消息的通信機制。其本質是一個保存數據的隊列,它通常被用于解耦不同組件或模塊之間的通信,以實現異步通信、提高系統的可伸縮性和可靠性。
- 消息中間件是利用高效可靠的消息傳遞機制進行與平臺無關的數據交流,并基于數據通信來進行分布式系統的構建。
- 消息中間件是分布式系統中重要的組件,主要解決應用解耦、異步消息、流量削峰等問題,實現高性能、高可用、可伸縮和最終一致性的系統架構。目前常見的消息隊列系統包括
Apache Kafka
、RabbitMQ
、RocketMQ
、ActiveMQ
等。
消息隊列關鍵概念
- 消息生產者(Producer):負責產生消息并將其發送到消息隊列中。
- 消息隊列(Message Queue):用于存儲消息的緩沖區或中介。消息隊列可以是內存中的數據結構,也可以是持久化的存儲系統。
- 消息消費者(Consumer):從消息隊列中獲取消息,并進行相應的處理。消費者負責處理消息的邏輯,通常是異步地從隊列中拉取消息。
- 消息:要在系統中傳遞的數據單元。消息可以是任何形式的數據,如文本、
JSON
、XML
等。
消息隊列優點
- 解耦性:生產者和消費者之間通過消息隊列進行通信,彼此不需要直接連接,降低了耦合度。
- 異步通信:生產者和消費者可以獨立運行,不需要等待對方的響應。
- 增強系統可靠性:即使一個組件或模塊不可用,消息仍然可以被存儲在隊列中,待組件恢復后繼續處理。
- 緩沖能力:消息隊列可以作為緩沖,處理高峰時段的突發流量,以及平滑系統的負載。
消息隊列的應用場景
異步處理
將一些非核心的業務流程以異步并行的方式執行,從而減少請求響應時間,提高系統吞吐量。
應用解耦
就是接觸應用系統之間的耦合依賴,通過消息隊列,使每個應用系統不必受其他系統影響,可以更獨立自主。
流量削峰
流量削峰一般在秒殺和團搶活動中使用廣泛,在應用前端加入消息隊列,秒殺業務處理系統根據消息隊列中的請求信息,再做后續處理。
消息通訊
消息通訊是指應用間的數據通信。消息隊列一般都內置了高效的通信機制,因此可以用在純的消息通訊。比如實現點對點消息隊列,或者聊天室等對點通訊。
常用消息隊列中間件的對比
目前常見的消息隊列系統包括 Apache Kafka
、RabbitMQ
、RocketMQ
、ActiveMQ
等,選擇合適的消息隊列取決于應用的需求、性能要求以及可用的基礎設施。
kafka | RabbitMQ | RocketMQ | ActiveMQ | |
---|---|---|---|---|
資料文檔 | 中等 | 多 | 少 | 多 |
開發語言 | Scala | Eriang | Java | Java |
支持協議 | 自定義(基于TCP) | AMQP | 自定義 | OpenWire、STOMP、RESR、XMPP、AMQP |
消息存儲 | 內存、磁盤、數據庫;支持大量堆積 | 內存、磁盤;支持少量堆積 | 磁盤;支持大量堆積 | 內存,磁盤,數據庫;支持少量堆積 |
消息事務 | 支持 | 支持 | 支持 | 支持 |
負載均衡 | 支持 | 支持 | 支持 | 可基于zk實現負載均衡 |
集群管理 | leader-slave | 支持簡單集群 | master-slave | 支持簡單集群 |
管理界面 | 一般 | 好 | 很好 | 一般 |
可用性 | 非常高 | 高 | 非常高 | 高 |
吞吐TPS | 極大 | 比較大 | 大 | 比較大 |
順序消息 | 支持 | 不支持 | 支持 | 不支持 |
消息確認 | 支持 | 支持 | 支持 | 支持 |
消息回調 | 支持指定分區offset位置回調 | 不支持 | 支持指定時間點的回調 | 不支持 |
消息重試 | 不支持 | 不支持 | 支持 | 不支持 |
并發度 | 高 | 極高 | 高 | 高 |