MQ學習系列:php
本文是-消息隊列學習的概念與介紹篇。目的是可以對消息隊列可以有一個簡單的瞭解和大致的認知。html
參考/學習資料整理(好東西要學會分享 )java
架構之家公衆號上的消息隊列文章github
JavaGuide(一份涵蓋大部分Java程序員所須要掌握的核心知識的文檔類項目)面試
JCSprout(處於萌芽階段的 Java 核心知識庫)數據庫
一個在線繪圖的工具apache
消息隊列 MQ(message queue)中間件是分佈式系統中的重要組件,主要解決異步消息、應用解耦、流量 削峯等問題,從而實現高性能、高可用 ,可伸縮和最終一致性的架構。
使用較多的消息隊列有ActiveMQ 、RabbitMQ、RocketMQ、Kafka、MetaMQ等
舉個栗子:
有這樣一個用戶註冊場景 ,實現將註冊信息寫入數據庫併發送郵件和註冊短信的功能。
傳統的方式如圖:
這樣的方式會一步步按照前後順序 完成後返回給用戶信息 ,整個過程用戶都處於等待的狀態,並用時150ms。
而引用消息對列 ,異步處理,改造後的架構以下:
這樣對於用戶的響應時間就大大減小了。
多應用間經過消息隊列對同一消息進行處理,避免調用接口失敗致使整個過程失敗。
普遍應用於秒殺或搶購活動中,避免流量過大致使應用系統掛掉的狀況。
具體場景:購物網站開展秒殺活動,通常因爲瞬時訪問量過大,服務器接收過大,會致使流量暴增,相關係統沒法處理請求甚至崩潰。而加入消息隊列後,系統能夠從消息隊列中取數據,至關於消息隊列作了一次緩衝。
JMS(JAVA Message Service,java消息服務)是java的消息服務,JMS的客戶端之間能夠經過JMS服務進行異步的消息傳輸。JMS(JAVA Message Service,Java消息服務)API是一個消息服務的標準或者說是規範,容許應用程序組件基於JavaEE平臺建立、發送、接收和讀取消息。它使分佈式通訊耦合度更低,消息服務更加可靠以及異步性。
ActiveMQ 就是基於 JMS 規範實現的。
P2P模式包含三個角色:消息隊列(Queue)、發送者(Sender)、接收者(Receiver)。每一個消息都被髮送到一個特定的隊列,接收者從隊列中獲取消息。隊列保留消息 ,直到他們被消費或超時。
P2P的特色:
若是但願發送的每一個消息都會被成功處理的話,那麼須要P2P模式。
Pub/Sub模式包含三個角色:主題(Topic)、發佈者(Publisher)、訂閱者(Subscriber)。多個 發佈者將消息發佈到Topic,系統將這些消息傳遞給多個訂閱者。
Pub/Sub的特色:
若是但願發送的消息能夠被多個消費者處理的話,那麼能夠採用Pub/Sub模型。
JMS定義了五種不一樣的消息正文格式,以及調用的消息類型,容許你發送並接收以一些不一樣形式的數據,提供現有消息格式的一些級別的兼容性。
AMQP,即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標準 高級消息隊列協議(二進制應用層協議),是應用層協議的一個開放標準,爲面向消息的中間件設計,兼容 JMS。基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件同產品,不一樣的開發語言等條件的限制。
RabbitMQ 就是基於 AMQP 協議實現的。
對比方向 | JMS | AMQP |
---|---|---|
定義 | Java API | 協議 |
跨語言 | 否 | 是 |
跨平臺 | 否 | 是 |
支持消息類型 | 提供兩種消息模型:①Peer-2-Peer;②Pub/sub | 提供了五種消息模型:①direct exchange;②fanout exchange;③topic change;④headers exchange;⑤system exchange。本質來說,後四種和JMS的pub/sub模型沒有太大差異,僅是在路由機制上作了更詳細的劃分; |
支持消息類型 | 支持多種消息類型 ,咱們在上面提到過 | byte[](二進制) |
總結:
對比方向 | 概要 |
---|---|
吞吐量 | 萬級的 ActiveMQ 和 RabbitMQ 的吞吐量(ActiveMQ 的性能最差)要比 十萬級甚至是百萬級的 RocketMQ 和 Kafka 低一個數量級。 |
可用性 | 均可以實現高可用。ActiveMQ 和 RabbitMQ 都是基於主從架構實現高可用性。RocketMQ 基於分佈式架構。 kafka 也是分佈式的,一個數據多個副本,少數機器宕機,不會丟失數據,不會致使不可用 |
時效性 | RabbitMQ 基於erlang開發,因此併發能力很強,性能極其好,延時很低,達到微秒級。其餘三個都是 ms 級。 |
功能支持 | 除了 Kafka,其餘三個功能都較爲完備。 Kafka 功能較爲簡單,主要支持簡單的MQ功能,在大數據領域的實時計算以及日誌採集被大規模使用,是事實上的標準 |
消息丟失 | ActiveMQ 和 RabbitMQ 丟失的可能性很是低, RocketMQ 和 Kafka 理論上不會丟失。 |
總結: