《RabbitMQ實戰指南》整理(一)RabbitMQ簡介及入門

一、什麼是消息中間件

消息隊列中間件是指利用高效可靠的消息傳遞機制進行與平臺無關的數據交流,並基於數據通信來進行分佈式系統的集成。它一般有兩種傳遞模式:點對點模式和發佈/訂閱模式。

消息中間件能夠在不同平臺之間進行通信,它常用來屏蔽各種平臺及協議之間的特性,實現應用程序之間的協同,其優點在於能夠在客戶和服務器之間提供同步異步的連接,並且在任何時刻都可以將消息進行傳送或者存儲轉發。

二、消息中間件的作用

  • 解耦:消息中間件在處理過程中間插入了一個隱含的、基於數據的接口層,兩邊的處理過程都要實現這一接口,這允許你獨立地擴展或修改兩邊的處理過程,只要確保它們遵循相同的接口約束。
  • 冗餘:在某些情況下處理數據的過程會失敗,消息中間件可以把數據進行持久化直到它們已經完全被處理,以達到規避數據丟失風險的目的。
  • 擴展性:因爲消息中間件解耦了應用程序的處理過程,所以提高消息入隊和處理的效率是很容易的,只需要另外增加處理過程即可。
  • 削峯:使用消息中間件能夠使關鍵組件支撐突發訪問壓力,不會因爲突發的超負荷請求而完全崩潰。
  • 可恢復性:一個處理消息的進程掛掉,不會影響到整個系統,系統恢復後仍可以處理。
  • 順序保證:大多數消息中間件支持一定程度上的順序性。
  • 緩衝:消息中間件通過一個緩衝層來幫助任務最高效的執行,寫入消息中間件的處理會盡可能快速。
  • 異步通信:消息中間件提供了異步處理機制,允許把消息放入中間件中不立即處理,而是在之後需要的時候再慢慢處理。

三、相關概念介紹

1、生產者和消費者

  • Producer:生產者,投遞消息的一方;生產者創建消息併發布到RabbitMQ中,消息一般分爲消息體和標籤,標籤Label用來表述這條消息,消息體Payload一般是一個帶有業務邏輯結構的數據如Json字符串
  • Consumer:消費者,接受消息的一方;消費者消費一條消息時,指揮消費消息的消息體,再消息路由的過程中,消息的標籤會被丟棄
  • Broker:消息中間件的服務節點;一個RabbitMQ Broker可以簡單看作是一個RabbitMQ服務節點,或者RabbitMQ實例;生產者對業務數據包裝後封裝成消息,發送到Broker中,消費者經過解包處理得到原始的數據,再進行業務邏輯處理

2、隊列

Queue:隊列是RabbitMQ的內部對象,用於存儲消息;RabbitMQ的消息只能存儲在隊列中;多個消費者可以訂閱同一個隊列,隊列中的消息會被平均分攤,給多個消費者進行處理,而不是每個消費者都收到所有的消息並處理;RabbiteMQ不支持隊列層面的廣播消費,也不建議這麼做

3、交換器、路由器、綁定

  • Exchange:交換器;在實際情況中,生產者將消息發送到Exchange,由交換器將消息路由到一個或多個隊列中;RabbitMQ的交換器由四種類型,不同的類型有不同的路由策略
  • RoutingKey:路由鍵;生產者將消息發送給交換器時,會指定一個RoutingKey,用來指定這個消息的路由規則,這個路由鍵與交換器類型和綁定鍵聯合使用纔會生效;在交換器類型和綁定鍵固定的情況下,生產者可以在發送消給交換器時,通過指定RoutingKey來決定消息流向哪裏
  • Binding:綁定;RabbitMQ中通過綁定將交換器和隊列聯合起來,在綁定的時候一般會指定一個BingdingKey,這樣RabbitMQ就會知道如何正確地將消息路由到隊列中;生產者將消息發送給交換器時需要一個RoutingKey,當BingdingKey和RoutingKey相匹配時,消息會被路由到對應的隊列中,在綁定多個隊列到同一個交換器時,這些綁定允許使用相同的BIngdingKey

以郵寄信件爲例,交換器相當於投遞的郵箱,RoutingKey相當於填寫在包裹上的地址,BingdingKey相當於包裹的目的地,爲了避免混淆,可以這麼理解:在使用綁定時,其中需要的路由鍵是BindingKey;在發送消息的時候,其中需要的路由鍵是RoutingKey

4、交換器的類型

RabbitMQ常用的交換器類型有fanout、direct、topic和headers四種,AMQP協議中還有System和自定義,這裏不予討論

  • fanout:將所有發送到該交換器的消息路由帶所有與該交換器綁定的隊列中;
  • direct:把消息路由到BindingKey和RoutingKey完全匹配的隊列中;
  • topic:同樣是將消息路由到BindingKey和RoutingKey相匹配的隊列中,但匹配規則有所不同:①RoutingKey爲一個點號分隔的字符串;②BindingKey和RoutingKey同樣也是一個點號分隔的字符串;BingdingKey中可以存在兩種特殊字符*和#用於模糊匹配,星號用於匹配一個單詞,井號用於匹配多規格單詞
  • headers:不依賴於路由鍵的匹配規則來路由消息,而是根據發送的消息內容中的headers屬性進行匹配,該交換器性能較差,一般很少使用

5、RabbitMQ運轉流程

生產者發送消息:

  1. 生產者連接到RabbitMQ Broker,建立一個連接,開啓一個信道;
  2. 生產者聲明一個交換器,並且設置相關屬性,如交換器類型,是否持久化等;
  3. 生產者聲明一個隊列並設置相關的屬性,如是否排他,是否持久化,是否自動刪除等;
  4. 生產者通過路由鍵將交換器和隊列綁定起來;
  5. 生產者發送消息至RabbitMQ Broker,其中包括路由鍵和交換器等消息;
  6. 相應的交換器根據接受到的路由鍵查找相匹配的隊列,找到後會將消息存入隊列,否則根據配置選擇丟棄或退回;
  7. 關閉信道;
  8. 關閉連接;

消費者接受消息:

  1. 消費者連接到RabbitMQ Broker,建立一個連接,開啓一個信道;
  2. 消費者向RabbitMQ Broker請求消費相應隊列中的消息,可以設置相應的回調函數及做部分準備工作;
  3. 等待RabbitMQ Broker迴應並投遞相應隊列中的消息,消費者接受消息;
  4. 消費者確認(ACK)接受到的消息;
  5. RabbitMQ從隊列中刪除相應已經被確認的消息;
  6. 關閉信道;
  7. 關閉連接;

生產者和消費者都需要與RabbitMQ Broker建立連接,這個連接就是一條TCP連接,也就是Connection,一旦TCP連接建立起來,客戶端可以創建一個信道(Channel),每個信道都會被指派一個唯一的ID,信道是建立在Connection之上的連接。對於操作系統而言,建立和銷燬TCP連接是非常昂貴的開銷,因此RabbitMQ使用類似Non0blocking I/O的做法,選擇TCP連接複用,不僅可以減少性能的開銷,同時便於管理

四、AMQP協議介紹

RabbitMQ是AMQP協議的Erlang實現,本身包括三層:

  • Module Layer:位於協議的最高層,定義了一些供客戶端調用的命令,客戶端可以利用這些命令實現自己的業務邏輯;
  • Session Layer:位於中間層,主要負責將客戶端的命令發送給服務器,再將服務器的應答返回給客戶端,爲客戶端和服務器之間的通信信道提供可靠性同步機制和錯誤處理;
  • Transport Layer:位於最底層,主要傳輸二進制數據流,提供幀的處理、信道複用、錯誤檢測和數據表示等;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章