天天看點

rabbitmq系列(一)初識rabbitmq

為什麼要使用消息中間件

案例:假如我們開發了一個商品搶購網站。這個網站的目的就是在某一時間點進行搶購商品,同時要求使用者注冊,在注冊的時候會同時給使用者電話和郵箱中發送驗證碼,以便完成資訊注冊。傳統做法應該是這樣的。兩種方式,并行即啟用兩個線程,當使用者送出資訊後,分别去發送郵件和發送短信。這種方式很明顯比串行的方式更快。當我們加入消息隊列後,處理方式如下圖:

rabbitmq系列(一)初識rabbitmq

加入消息中間件後,我們隻需要注冊資訊存庫後,給消息隊列中添加一條消息就完事了。然後郵件服務和短信服務分别去消費消息即可。

rabbitmq系列(一)初識rabbitmq

當使用者注冊完成後,到了搶購商品的時間,大家都去搶購某個商品的時候這個量很大。消息隊列可以設定隊列長度來保證系統的穩定性。當隊列滿了的時候,則不再處理這些使用者請求。

是以我們可以總結一下消息隊列的特點:

  1. 異步處理 -- 使用者注冊資訊送出後,直接傳回響應。然後郵件服務和短信服務監聽到隊列有消息後去主動處理
  2. 應用解耦 -- 使用者注冊流程分成了三個服務,注冊服務、郵件服務、短信服務互不幹擾。
  3. 流量削峰 -- 控制使用者請求,以防系統奔潰。

常見消息中間件介紹

ActiveMQ:apache出品,能力強勁的開源消息總線,完全支援jms規範的消息中間件。api豐富,在傳統行業的中小型企業中應用廣泛。缺點:服務性能和資料存儲性能不好。

Kafka:apache頂級項目,追求高吞吐量。一開始的目的是用于日志收集和傳輸。不支援事務,對消息重複,丢失,錯誤沒有嚴格的請求。适合産生大量資料的網際網路服務的資料收集業務。

RocketMQ:阿裡開源中間件,目前已孵化成apache頂級項目,純java開發,思路起源于kafka,對消息的可靠性傳輸和事務性做了優化。特點:高吞吐量、高可用。适合大規模分布式系統應用。目前在阿裡集團被廣泛使用,用于交易、充值,流計算,日志處理,消息推送等。現在推出了商業版,有些功能對外不開發。

RabbitMQ:是一個開源的消息代理和隊列伺服器,用來通過普通協定在完全不同的應用之間共享資料,RabbitMQ是使用ErLang語言來編寫的,并且基于AMQP協定。erlang語言開發,性能較好,高并發。社群活躍度高,網上資料比較多。

什麼是AMQP協定

AMQP(Advanced Message Queuing Protocol,進階消息隊列協定)是一個程序間傳遞異步消息的網絡協定。

涉及到的具體概念:

  • server - 又稱broker,接收用戶端的連結,實作amqp實體服務。
  • Connection - 連結,應用程式跟broker的網絡連結。
  • channel - 網絡信道,幾乎所有的操作都是在channel中進行,資料的流轉都要在channel上進行。channel是進行消息讀寫的通道。用戶端可以建立多個channel,每個channel代表一個會話任務。
  • message - 消息,伺服器與應用程式之間傳送的資料。由properties和body組成。properties可以對消息進行修飾,比如消息的更新,延遲等進階特性。body就是消息體的内容。
  • virtual host - 虛拟主機,用于進行邏輯隔離,最上層的消息路由,一個虛拟位址裡面可以有多個交換機。exchange和消息隊列message quene。
  • exchange - 交換機,接收消息,根據路由器轉發消息到綁定的隊列。
  • binding - 綁定,交換機和隊列之間的虛拟連結,綁定中可以包含routing key。
  • routing key - 一個路由規則,虛拟機可以用它來确定如何路由一個特定消息。
  • quene - 消息隊列,儲存消息并将它們轉發給消費者。

詳細了解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(直連交換機):

  1. 所有發送到directExchange的消息被轉發到RouteKey中指定的Queue
  2. rabbitmq有一個自帶的exchange叫default exchange,這個交換機是direct類型的。rabbitmq會讓路由鍵跟隊列名相等進行綁定。

topic(主題交換機):

  1. 所有發送到topic exchange的消息被轉發到所有關心RouteKey的Queue上
  2. Exchange将RouteKey和某些隊列進行模糊比對,此時隊列需要綁定一個Topic

模糊比對可以使用通配符:

#可以比對一個或多個詞

*隻能比對一個詞

比如:"log.#"可以比對到“log.info.oa”。“log.*”隻會比對到“log.error”

Fanout(扇型交換機):

  1. 不處理路由鍵,隻需要簡單的将隊列綁定到交換機上。
  2. 發送到交換機的消息都會被轉發到與該交換機綁定的所有隊列上
  3. fanout交換機轉發消息是最快的。