1. 程式人生 > 其它 >RabbitMQ的工作模式概念詳解

RabbitMQ的工作模式概念詳解

目錄

一、核心概念

  • 生產者:傳送訊息的應用程式。
  • 消費者:接收訊息的應用程式。
  • 佇列:儲存訊息的緩衝區。
  • 訊息:通過RabbitMQ從生產者傳送給消費者的資訊。
  • 連線:連線是應用程式和RabbitMQ代理之間的TCP連線。
  • 通道:通道是連線內的虛擬連線。當您從佇列中釋出或使用訊息時 - 它們都是通過通道完成的。
  • Exchange:接收來自生產者的訊息,並根據交換型別定義的規則將其推送到佇列。要接收訊息,需要將佇列繫結到至少一個交換。
  • 繫結:繫結是佇列和交換之間的連結。
  • 路由金鑰:路由金鑰是交換機檢視的金鑰,用於決定如何將訊息路由到佇列。路由金鑰就像訊息的地址。
  • AMQP:AMQP(高階訊息佇列協議)是RabbitMQ用於訊息傳遞的協議。
  • 使用者:可以使用給定的使用者名稱和密碼連線到RabbitMQ。可以為每個使用者分配許可權,例如在例項中讀取,寫入和配置許可權的許可權。

二、工作模式

2.1 simple簡單佇列

最簡單的工作佇列,其中一個訊息生產者,一個訊息消費者,一個佇列。也稱為點對點模式

1.生交給預設的交換機(AMQP default)
2.交換機獲取訊息後交給繫結這個生產者的佇列(關係是通過佇列名稱完成)
3.消費者監聽當前佇列的消費者獲取訊息,執行消費邏輯
應用場景:聊天(中間有一個過度的伺服器;p端,c端)

2.2 work工作佇列

生產者發訊息,啟動多個消費者例項來消費訊息,每個消費者僅消費部分資訊,可達到負載均衡的效果。

1.迴圈分發,假如我們擁有兩個消費者,預設情況下,RabbitMQ 將按順序將每條訊息傳送給下一個消費者,平均而言,每個消費者將獲得相同數量的訊息,這種分發訊息的方式稱為輪詢,可達到負載均衡的效果。

2.訊息產生者將訊息放入佇列消費者可以有多個,消費者1,消費者2,同時監聽同一個佇列,訊息被消費?C1 C2共同爭搶當前的訊息佇列內容,誰先拿到誰負責消費訊息。

3.(隱患,高併發情況下,預設會產生某一個訊息被多個消費者共同使用,可以設定一個開關(syncronize,與同步鎖的效能不一樣) 保證一條訊息只能被一個消費者使用)。

4.應用場景:紅包;大專案中的資源排程(任務分配系統不需知道哪一個任務執行系統在空閒,直接將任務扔到訊息佇列中,空閒的系統自動爭搶)。

2.3 publish/subscribe釋出訂閱(共享資源)

使用fanout型別交換器,routingKey忽略。每個消費者定義生成一個佇列並繫結到同一個 Exchange,每個消費者都可以消費到完整的訊息。訊息廣播給所有訂閱該訊息的消費者。

1.在RabbitMQ中,生產者不是將訊息直接傳送給訊息佇列,實際上生產者根本不知道一個訊息被髮 送到哪個佇列。

2.生產者將訊息傳送給交換器。交換器非常簡單,從生產者接收訊息,將訊息推送給訊息佇列。交換器必須清楚地知道要怎麼處理接收到的訊息。應該是追加到一個指定的佇列,還是追加到多個佇列,還是丟棄。規則就是交換器型別。

3.交換器的型別: direct 、 topic 、 headers 和 fanout 四種類型。釋出訂閱使 用fanout。fanout 交換器從名字就可以看出來(用風扇吹出去),將所有收到的訊息傳送給它知道 的所有的佇列。

應用場景:郵件群發,廣告

2.4 路由模式

使用 direct 型別的Exchange,發N條消費並使用不同的 routingKey ,消費者定義佇列並將隊 列、 routingKey 、Exchange繫結。此時使用 direct 模式Exchagne必須要 routingKey 完全匹配的 情況下訊息才會轉發到對應的佇列中被消費。

1.訊息生產者將訊息傳送給交換機按照路由判斷,路由是字串(info) 當前產生的訊息攜帶路由字元(物件的方法),交換機根據路由的key,只能匹配上路由key對應的訊息佇列,對應的消費者才能消費訊息;

2.在路由模式它會把訊息路由到那些 binding key 與 routing key 完全匹配的 Queue 中,此模式也就是 Exchange 模式中的direct模式

3.從系統的程式碼邏輯中獲取對應的功能字串,以 routingKey="error" 傳送訊息到 Exchange,則訊息會路由到Queue1(amqp.gen-S9b…,這是由RabbitMQ自動生成的Queue名稱)和Queue2(amqp.gen-Agl…)。如果我們以 routingKey="info" 或 routingKey="warning" 來發送訊息,則訊息只會路由到 Queue2。如果我們以其他 routingKey 傳送訊息,則訊息不會路由到這兩個 Queue 中

應用場景:根據生產者的要求傳送給特定的一個或者一批佇列;錯誤的通報;

2.5 topic主題模式

使用 topic 型別的交換器,佇列繫結到交換器、 bindingKey 時使用萬用字元,交換器將訊息路由轉發到具體佇列時會根據訊息 routingKey 模糊匹配,比較靈活。

1. P 表示為生產者、 X 表示交換機、C1C2 表示為消費者,紅色表示佇列。

2."*" 表示任何一個詞 "#" 表示0或多個詞

3.topics 模式與 routing 模式比較相近,topics 模式不能具有任意的 routingKey,必須由一個英文句點號“.”分隔的字串(我們將被句點號“.”分隔開的每一段獨立的字串稱為一個單詞),比如 "lazy.orange.fox"。topics routingKey 中可以存在兩種特殊字元“”與“#”。

4.如果一個訊息的 routingKey 設定為 “xxx.orange.rabbit”,那麼該訊息會同時路由到 Q1 與 Q2,routingKey="lazy.orange.fox”的訊息會路由到Q1與Q2;

routingKey="lazy.brown.fox”的訊息會路由到 Q2;

routingKey="lazy.pink.rabbit”的訊息會路由到 Q2(只會投遞給Q2一次,雖然這個routingKey 與 Q2 的兩個 bindingKey 都匹配);

routingKey="quick.brown.fox”、routingKey="orange”、routingKey="quick.orange.male.rabbit”的訊息將會被丟棄,因為它們沒有匹配任何bindingKey。

5.如果在 topic 型別的交換器中 bindingKey 使用 # ,則就是 fanout 型別交換器的行為。

6.如果在 topic 型別的交換器中 bindingKey 中不使用 * 和 # ,則就是 direct 型別交換器的行為