1. 程式人生 > >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交換機轉發訊息是最快的。

如果文章對您有幫助,請記得點贊關注喲~
歡迎大家關注我的公眾號:位元組傳說,每日推送技術文章供大家學習參考。