什么是MQ
- MQ(Message Queue),為消息隊列,又叫消息中間件,是類似於數據庫一樣的應用,需要單獨去部署。
- 消息 –
是在兩台計算機間傳送的數據單位。消息可以非常簡單,例如只包含文本字符串; 也可以更復雜,可能包含嵌入對象。 消息被發送到隊列中。 - 隊列 – 是提供路由並保證消 息的傳遞;如果發送消息時接收者不可用,消息隊列會保留消息,直到可以成功地傳遞它。
- 消息隊列 – 是在消息的傳輸過程中保存消息的容器。消息隊列管 理器在將消息從它的源中繼到它的目標時充當中間人。
什么是JMS MQ
- JMS(Java MessageService),為Java 消息服務,是 Java 的一套 API
標准,最初的目的是為了使應用程序能夠訪問現有的 MOM 系 統。 - MOM(MessageOriented Middleware) ,是利用高效可靠的消息傳遞機
制進行平台無關的數據交流,並基於數據通信來進行分布式系統的集成。
MQ的作用,應用場景
-
異步通信
有些業務不想也不需要立即處理消息。消息隊列提供了異步處理機制,允許用戶把一個消息放入隊列,但並不立即處理它。想向隊列中放入多少消息就放多少,然后在需要的時候再去處理它們。
-
緩沖
在任何重要的系統中,都會有需要不同的處理時間的元素。消息隊列通過一個緩沖層來幫助任務最高效率的執行,該緩沖有助於控制和優化數據流經過系統的速度。以調節系統響應時間。
-
解耦
降低工程間的強依賴程度,針對異構系統進行適配。在項目啟動之初來預測將來項目會碰到什么需求,是極其困難的。通過消息系統在處理過程中間插入了一個隱含的、基於數據的接口層,兩邊的處理過程都要實現這一接口,當應用發生變化時,可以獨立的擴展或修改兩邊的處理過程,只要確保它們遵守同樣的接口約束。
-
冗余
有些情況下,處理數據的過程會失敗。除非數據被持久化,否則將造成丟失。消息隊列把數據進行持久化直到它們已經被完全處理,通過這一方式規避了數據丟失風險。許多消息隊列所采用的”插入-獲取-刪除”范式中,在把一個消息從隊列中刪除之前,需要你的處理系統明確的指出該消息已經被處理完畢,從而確保你的數據被安全的保存直到你使用完畢。
-
擴展性
因為消息隊列解耦了你的處理過程,所以增大消息入隊和處理的頻率是很容易的,只要另外增加處理過程即可。不需要改變代碼、不需要調節參數。便於分布式擴容。
-
可恢復性
系統的一部分組件失效時,不會影響到整個系統。消息隊列降低了進程間的耦合度,所以即使一個處理消息的進程掛掉,加入隊列中的消息仍然可以在系統恢復后被處理。
-
順序保證
在大多使用場景下,數據處理的順序都很重要。大部分消息隊列本來就是排序的,並且能保證數據會按照特定的順序來處理。
-
過載保護
在訪問量劇增的情況下,應用仍然需要繼續發揮作用,但是這樣的突發流量無法提取預知;如果以為了能處理這類瞬間峰值訪問為標准來投入資源隨時待命無疑是巨大的浪費。使用消息隊列能夠使關鍵組件頂住突發的訪問壓力,而不會因為突發的超負荷的請求而完全崩潰。
-
數據流處理
分布式系統產生的海量數據流,如:業務日志、監控數據、用戶行為等,針對這些數據流進行實時或批量采集匯總,然后進行大數據分析是當前互聯網的必備技術,通過消息隊列完成此類數據收集是最好的選擇。
常用消息隊列(ActiveMQ、RabbitMQ、RocketMQ、Kafka)比較
特性MQ | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
生產者消費者模式 | 支持 | 支持 | 支持 | 支持 |
發布訂閱模式 | 支持 | 支持 | 支持 | 支持 |
請求回應模式 | 支持 | 支持 | 不支持 | 不支持 |
Api完備性 | 高 | 高 | 高 | 高 |
多語言支持 | 支持 | 支持 | java | 支持 |
單機吞吐量 | 萬級 | 萬級 | 萬級 | 十萬級 |
消息延遲 | 無 | 微秒級 | 毫秒級 | 毫秒級 |
可用性 | 高(主從) | 高(主從) | 非常高(分布式) | 非常高(分布式) |
消息丟失 | 低 | 低 | 理論上不會丟失 | 理論上不會丟失 |
文檔的完備性 | 高 | 高 | 高 | 高 |
提供快速入門 | 有 | 有 | 有 | 有 |
社區活躍度 | 高 | 高 | 有 | 高 |
商業支持 | 無 | 無 | 商業雲 | 商業雲 |