電腦做系統(tǒng)哪個網站比較好用西安網站外包
一、流程
首先先介紹一個簡單的一個消息推送到接收的流程,提供一個簡單的圖
黃色的圈圈就是我們的消息推送服務,將消息推送到 中間方框里面也就是 rabbitMq的服務器,然后經過服務器里面的交換機、隊列等各種關系(后面會詳細講)將數據處理入列后,最終右邊的藍色圈圈消費者獲取對應監(jiān)聽的消息。
二、交換機類型
常用的交換機有以下三種,因為消費者是從隊列獲取信息的,隊列是綁定交換機的,所以對應的消息推送/接收模式也會有以下幾種:
1、Direct Exchange
直連型交換機,根據消息攜帶的路由鍵將消息投遞給對應隊列。
大致流程,有一個隊列綁定到一個直連交換機上,同時賦予一個路由鍵 routing key 。
然后當一個消息攜帶著路由值為abc,這個消息通過生產者發(fā)送給交換機時,交換機就會根據這個路由值abc去尋找綁定值的隊列。
新建直流交換機
綁定信息?
?根據匹配條件routing Key(路由鍵)發(fā)送消息到隊列
隊列接收消息
2、Fanout Exchange
創(chuàng)建隊列,更改為廣播類型
扇型(廣播)交換機,這個交換機沒有路由鍵概念,就算你綁了路由鍵也是無視的。 這個交換機在接收到消息后,會直接轉發(fā)到綁定到它上面的所有隊列。
3、Topic Exchange
創(chuàng)建交換機,類型改為主題交換機
主題交換機,這個交換機其實跟直連交換機流程差不多,但是它的特點就是在它的路由鍵和綁定鍵之間是有規(guī)則的。
簡單地介紹下規(guī)則:
* (星號) 用來表示一個單詞 (必須出現的)
# (井號) 用來表示任意數量(零個或多個)單詞
// * 代表兩點之間一個占位單詞
// # 代表后面所有,匹配所有
通配的綁定鍵是跟隊列進行綁定的,舉個小例子
隊列Q1 綁定鍵為 *.TT.* 隊列Q2綁定鍵為 TT.#
如果一條消息攜帶的路由鍵為 A.TT.B,那么隊列Q1將會收到;
如果一條消息攜帶的路由鍵為TT.AA.BB,那么隊列Q2將會收到;
當一個隊列的綁定鍵為 "#"(井號) 的時候,這個隊列將會無視消息的路由鍵,接收所有的消息。
當 * (星號) 和 # (井號) 這兩個特殊字符都未在綁定鍵中出現的時候,此時主題交換機就擁有的直連交換機的行為。
如果只有 # ,它就實現了扇形交換機的功能。
所以主題交換機也就實現了扇形交換機的功能,和直連交換機的功能
三、交換機與隊列特性設置
Exchange、Queue屬性 durability
durability默認是durable(持久化),durability 屬性用于定義隊列或者交換機是否是持久化的。
當一個隊列或者交換機被聲明為持久化的時候,它們的元數據會被存儲到磁盤上,這樣即使在 RabbitMQ 服務器重啟后,這些隊列或者交換機的定義仍然存在。
持久化的隊列和交換機可以確保消息的持久化,即使 RabbitMQ 服務器重啟或者崩潰,消息也不會丟失。當消息被發(fā)送到持久化的隊列或者交換機時,它們會被寫入磁盤,以確保消息的持久性。
需要注意的是,僅僅將隊列或者交換機聲明為持久化是不夠的,消息本身也必須被標記為持久化,才能確保消息的持久性。這可以通過在消息的屬性中設置 delivery_mode 為 2 來實現。
總之, durability 屬性在 RabbitMQ 中用于確保隊列和交換機的持久化,以及消息的持久性,從而提高消息傳遞的可靠性。
Exchange、Queue類型 delete
在 RabbitMQ 中, auto delete 屬性用于定義隊列或交換機是否在沒有消費者或綁定時自動刪除。
當一個隊列或交換機被聲明為 auto delete 屬性為 true 時,當沒有消費者與該隊列關聯或者沒有綁定到該交換機的隊列時,它們會自動被刪除。
這個屬性通常用于臨時隊列或者臨時交換機的場景。臨時隊列或交換機是在沒有消費者或者綁定時自動創(chuàng)建的,用于處理一些臨時性的任務或者臨時的消息傳遞。
需要注意的是,如果一個持久化的隊列或交換機被聲明為 auto delete 屬性為 true,那么它們在沒有消費者或綁定時也會被自動刪除,但它們的定義會在 RabbitMQ 服務器重啟后重新創(chuàng)建。
總之, auto delete 屬性在 RabbitMQ 中用于定義隊列或交換機是否在沒有消費者或綁定時自動刪除,適用于臨時隊列或交換機的場景。
Exchange屬性Internal
Internal的意思是內部的意思,在交換機這里設置為“Yes”之后,表示當前Exchange是RabbitMQ內部使用,用戶所創(chuàng)建的Queue不會消費該類型交換機下的消息,既然是為了RabbitMQ系統(tǒng)所用,作為用戶,我們就沒有必要創(chuàng)建該類型的Exchange,當然默認也是選擇No.