案例:假如咱們開發了一個商品搶購網站。這個網站的目的就是在某一時間點進行搶購商品,同時要求用戶註冊,在註冊的時候會同時給用戶電話和郵箱中發送驗證碼,以便完成信息註冊。傳統作法應該是這樣的。兩種方式,並行即啓用兩個線程,當用戶提交信息後,分別去發送郵件和發送短信。這種方式很明顯比串行的方式更快。當咱們加入消息隊列後,處理方式以下圖:java
加入消息中間件後,咱們只須要註冊信息存庫後,給消息隊列中添加一條消息就完事了。而後郵件服務和短信服務分別去消費消息便可。apache
當用戶註冊完成後,到了搶購商品的時間,你們都去搶購某個商品的時候這個量很大。消息隊列能夠設置隊列長度來保證系統的穩定性。當隊列滿了的時候,則再也不處理這些用戶請求。segmentfault
所以咱們能夠總結一下消息隊列的特色:api
ActiveMQ:apache出品,能力強勁的開源消息總線,徹底支持jms規範的消息中間件。api豐富,在傳統行業的中小型企業中應用普遍。缺點:服務性能和數據存儲性能很差。服務器
Kafka:apache頂級項目,追求高吞吐量。一開始的目的是用於日誌收集和傳輸。不支持事務,對消息重複,丟失,錯誤沒有嚴格的請求。適合產生大量數據的互聯網服務的數據收集業務。網絡
RocketMQ:阿里開源中間件,目前已孵化成apache頂級項目,純java開發,思路起源於kafka,對消息的可靠性傳輸和事務性作了優化。特色:高吞吐量、高可用。適合大規模分佈式系統應用。目前在阿里集團被普遍使用,用於交易、充值,流計算,日誌處理,消息推送等。如今推出了商業版,有些功能對外不開發。併發
RabbitMQ:是一個開源的消息代理和隊列服務器,用來經過普通協議在徹底不一樣的應用之間共享數據,RabbitMQ是使用ErLang語言來編寫的,而且基於AMQP協議。erlang語言開發,性能較好,高併發。社區活躍度高,網上資料比較多。異步
AMQP(Advanced Message Queuing Protocol,高級消息隊列協議)是一個進程間傳遞異步消息的網絡協議。分佈式
涉及到的具體概念:高併發
詳細瞭解AMQP協議可參考這篇文章--------詳解AMQP協議
exchange:接收消息,並根據路由鍵轉發消息所綁定的隊列。
交換機的屬性:
name:交換機的名稱
type:交換機的類型direct,topic,fanout,headers
durability:是否須要持久化,true爲持久化。
auto delete:當最後一個綁定到exchange上的隊列刪除後,自動刪除該exchange。
internal:當前exchange是否用於rabbitMQ內部使用,默認爲false。
arguments:可擴展參數。用戶自自定義的交換機時,用到的參數。
交換機經常使用的類型爲direct,topic,fanout。headers不經常使用。
direct(直連交換機):
topic(主題交換機):
模糊匹配可使用通配符:
#能夠匹配一個或多個詞
*只能匹配一個詞
好比:"log.#"能夠匹配到「log.info.oa」。「log.*」只會匹配到「log.error」
Fanout(扇型交換機):
若是文章對您有幫助,請記得點贊關注喲~ 歡迎你們關注個人公衆號:字節傳說,每日推送技術文章供你們學習參考。