什麼是MQ?
MQ全稱爲Message Queue,即消息隊列面向消息的中間件。生產者往消息隊列中寫消息,消費可以讀取隊列中的消息。
是指利用高效可靠的消息傳遞機制與平臺無關的數據交流,並基於數據通信來進行分佈式系統的集成。通過提供消息傳遞和消息排隊模型在分佈式環境下提供應用解耦,彈性伸縮,冗餘存儲、流量削峯,異步通信,數據同步等功能。
大致的過程是這樣的:發送者把消息發送給消息服務器,消息服務器將消息存放在若干隊列/主題topic中,在合適的時候,消息服務器回將消息轉發給接受者。在這個過程中,發送和接收是異步的,也就是發送無需等待,而且發送者和接受者的生命週期也沒有必然的關係;尤其在發佈pub/訂閱sub模式下,也可以完成一對多的通信,即讓一個消息有多個接受者。
MQ主要作用
- 異步:調用者無需等待,異步進行處理;
- 解耦:解決了系統之間耦合調用的問題;
- 消峯:抵禦洪峯流量,保護了主業務;
MQ的優缺點
優點:
-
採用異步處理模式:消息發送者可以發送一個消息而無須等待響應。消息發送者將消息發送到一條虛擬的通道(主題或者隊列)上;消息接收者則訂閱或者監聽該愛通道。一條消息可能最終轉發給一個或者多個消息接收者,這些消息接收者都無需對消息發送者做出同步迴應。整個過程都是異步的;
-
應用系統之間解耦合發送者和接受者不必瞭解對方,只需要確認消息。發送者和接收者不必同時在線。
-
可對高流量進行削峯,保證系統的平穩運行。
缺點:
- 系統可用性降低,一般而言,引入的外部依賴越多,系統越脆弱,每一個依賴出問題都會導致整個業務鏈路出現問題;
- 系統複雜度提高,要考慮各種情況,例如消息的冪等性、消息的丟失、消費順序等;
- 分佈式事物,數據一致性問題;
各類MQ對比
MQ只是一種理念,天上飛的理念,必然有落地的實現。不管是哪款消息中間件,都有如下一些技術維度:
技術維度 | ActiveMQ | RocketMQ | RabbitMQ | Kafka |
---|---|---|---|---|
PRODUCER-CUMSUMER | 支持 | 支持 | 支持 | 支持 |
PUBLISH-SUBSCRIBE | 支持 | 支持 | 支持 | 支持 |
REQUEST-REPLY | 支持 | 支持 | 支持 | * |
API完整性 | 高 | (靜態配置) | 高 | 高 |
文檔完整性 | 高 | 中 | 高 | 高 |
多語言支持 | 支持,Java優先 | 支持 | 語言無關 | 支持,Java優先 |
單機吞吐量 | 萬級 | 萬級 | 萬級 | 十萬級 |
消息延遲 | * | * | 微秒級 | 毫秒級 |
可用性 | 高(主從) | 高 | 高(主從) | 非常高(分佈式 |
消息丟失 | * | * | 低 | 理論上不會丟失 |
消息重複 | * | * | 可控 | 理論上會有重複 |
快速入門 | 有 | 無 | 有 | 有 |
首次部署難度 | * | 高 | 低 | 中 |
編程語言 | Java | Java | erlang | scala |
應用領域 | 中小型項目 | 大型項目,集羣 | 中大型項目 | 大數據 |