天天看點

rabbitmqrabbitmq一:概念二:消息流轉流程三:交換機類型四:rabbitmq工作模式五:備份交換機六:過期時間(TTL)七:死信隊列八:延遲隊列九:優先級隊列

rabbitmq

一:概念

1:ConnectionFactory:用戶端與Rabbitmq建立連接配接,我們發一條消息連接配接一次,這樣很顯然是浪費資源的,建立連接配接的過程也很耗時,是以我們就會做一個東西讓他來管理連接配接,當我用的時候,直接從裡邊拿出來已經建立好的連接配接發資訊,那麼ConnectionFactory應運而生。

2:channel:消息生産者發送消息到交換機的通道叫channel。

3:交換機Exchange:接收消息生産者發送的消息,作用:一個消息發送多個通道,生産者一條條的發送,太麻煩,交換機就是解決這一問題的。

4:隊列:消息緩存。

5:routingKey:路由鍵,生産者發送消息所帶的參數,交換機根據該參數比對bingKey,比對成功,則發送到綁定的隊列上去。

6:bindingKey:綁定鍵:交換機與隊列綁定的唯一ID。可以手動綁定,也可以在代碼中綁定。

二:消息流轉流程

1:發送者發送消息(攜帶參數:交換機,routingKey)

2:rabbitmq根據交換機名稱将消息發送到指定的交換機

3:交換機根據routingKey比對交換機下所有bindingKey,滿足,則把消息發送bindingKey對應的隊列中去。

4:rabbitmq根消費者據用戶端訂閱的隊列,把隊列消息push到消費者。

三:交換機類型

1:direct 直流交換機

根據消息的路由鍵routingkey,将消息以完全比對的方式路由到指定的隊列中。

這裡的比對指的是消息本身攜帶的路由鍵和隊列與交換機綁定的綁定鍵進行對比,完全一緻才算比對上。

2:topic 主題交換機:

和direct交換機非常類似,根據消息的路由鍵routingkey,将消息以模糊比對的方式路由到指定的隊列中。

3:fanout 扇形交換機:

不管消息的路由鍵是什麼,它直接将發送到該交換機的消息路由到所有與它綁定的隊列中。

4:headers 頭部交換機

不常用

四:rabbitmq工作模式

1:簡單模式

rabbitmqrabbitmq一:概念二:消息流轉流程三:交換機類型四:rabbitmq工作模式五:備份交換機六:過期時間(TTL)七:死信隊列八:延遲隊列九:優先級隊列

一個生産者,一個隊列,一個消費者。(這裡沒有交換機)

2:work queue(工作隊列)

rabbitmqrabbitmq一:概念二:消息流轉流程三:交換機類型四:rabbitmq工作模式五:備份交換機六:過期時間(TTL)七:死信隊列八:延遲隊列九:優先級隊列

一個生産者,一個隊列,同一個隊列裡面的消息被多個消費者同時消費,每條消費隻會被消費一次。(這裡沒有交換機)

3:釋出訂閱模式

rabbitmqrabbitmq一:概念二:消息流轉流程三:交換機類型四:rabbitmq工作模式五:備份交換機六:過期時間(TTL)七:死信隊列八:延遲隊列九:優先級隊列

一個消費者将消息首先發送到交換器(fanout),交換器綁定到多個隊列,然後被監聽該隊列的消費者所接收并消費。

ps:X表示交換器,在RabbitMQ中,這裡的交換器是 fanout(發送所有綁定的隊列中,不在關注routingKey)。

  兩個消費者獲得了同一條消息。即就是,一個消息從交換機同時發送給了兩個隊列中,監聽這兩個隊列的消費者消費了這個消息;

如果沒有隊列綁定交換機,則消息将丢失。因為交換機沒有存儲能力,消息隻能存儲在隊列中。

4:路由模式

rabbitmqrabbitmq一:概念二:消息流轉流程三:交換機類型四:rabbitmq工作模式五:備份交換機六:過期時間(TTL)七:死信隊列八:延遲隊列九:優先級隊列

生産者将消息發送到交換器(direct),在綁定隊列和交換器的時候有一個路由key,生産者發送的消息會指定一個路由key,那麼消息隻會發送到相應key相同的隊列,接着監聽該隊列的消費者消費消息。

也就是讓消費者有選擇性的接收消息。

路由模式,是以路由規則為導向,引導消息存入符合規則的隊列中。再由隊列的消費者進行消費的。

5:主題模式

rabbitmqrabbitmq一:概念二:消息流轉流程三:交換機類型四:rabbitmq工作模式五:備份交換機六:過期時間(TTL)七:死信隊列八:延遲隊列九:優先級隊列

使用topic交換機,上面的路由模式是根據路由key進行完整的比對(完全相等才發送消息),這裡的通配符模式通俗的來講就是模糊比對。

符号“#”表示比對一個或多個詞,符号“*”表示比對一個詞。與路由模式相似,但是,主題模式是一種模糊的比對方式。

五:備份交換機

生産者在發送消息的時候如果不設定 mandatory 參數 那麼消息在未被路由的情況下将會丢失,如果設定了 mandatory 參數,那麼需要添加 ReturnListener 的程式設計邏輯,生産者的代碼将變得複雜。如果既不想複雜化生産者的程式設計邏輯,又不想消息丢失,那麼可以使用備份交換器,這樣可以将未被路由的消息存儲在 RabbitMQ 中,再在需要的時候去處理這些消息。

六:過期時間(TTL)

RabbitMQ 可以對消息和隊列設 TTL。目前有兩種方法可以設定消息的 TTL 。第一種方法是通過隊列屬性設定,隊列中所有消息都有相同的過期時間。第二種方法是對消息本身進行單獨設定,每條消息的 TTL 可以不同。如果兩種方法一起使用,則消息的 TTL 以兩者之間較小的那個數值為準。消息在隊列中的生存時一旦超過設定 TTL 值時,就會變成"死信" (Dead Message) ,消費者将無法再收到該消息,這點不是絕對。
           

七:死信隊列

DLX ,全稱為 Dead-Letter-Exchange ,可以稱之為死信交換器,也有人稱之為死信郵箱。當消息在一個隊列中變成死信 (dea message) 之後,它能被重新被發送到另一個交換器中,這個交換器就是 DLX ,綁定 DLX 的隊列就稱之為死信隊列。

消息變成死信一般是由于以下幾種情況:
1:消息被拒絕,并且設定requeue參數為false
2:消息過期
3:隊列達到最大長度
           

對于 RabbitMQ 來說, DLX 是個非常有用的特性,它可以處理異常情況下,消息不能夠被消費者正确消費(消費者調用了 Basic.Nack 或者 Basic.Reject) 而被置入死信隊列中的情況,後續分析程式可以通過消費這個死信隊列中的内容來分析當時所遇到的異常情況,進而可以改善和優化系統。

八:延遲隊列

延遲隊列存儲的對象是對應的延遲消息,所謂"延遲消息"是指當消息被發送以後,并不想讓消費者立刻拿到消息,而是等待特定時間後,消費者才能拿到這個消息進行消費。

九:優先級隊列

具有高優先級的隊列具有高的優先權,優先級高的消息具備優先被消費的特權。可以通過設定隊列的x-max-priority 參數來實作。

優先級高的消息可以被優先消費,這個也是有前提的 如果在消費者的消費速度大于生産者的速度Broke 中沒有消息堆積的情況下,對發送的消息設定優先級也就沒有什麼實際意義。因為生産者剛發送完一條消息就被消費者消費了,那麼就相當于 Broker 中至多隻有一條消息,對于單條消息來說優先級是沒有什麼意義的。           

繼續閱讀