rabbitMQ的四種交換機

2021-09-05 10:51:42 字數 2400 閱讀 9182

交換機的型別:direct exchange(直連交換機)、fanout exchange(扇型交換機)、topic exchange(主題交換機)、headers exchange(頭交換機)、預設存在的交換機、dead letter exchange(死信交換機)

在rabbitmq中,生產者不是直接將訊息傳送給消費者,生成者根本不知道這個訊息要傳遞給哪些佇列。實際上,生產者只是將訊息傳送到交換機。交換機收到訊息到,根據交換機的型別和配置來處理訊息,有如下幾種情況:

將訊息傳送到特定的佇列

有可能傳送到多個佇列中

也有可能丟棄訊息

rabbitmq各個元件的功能重新歸納一下如下:

生產者:傳送訊息

交換機:將收到的訊息根據路由規則路由到特定佇列

佇列:用於儲存訊息

消費者:收到訊息並消費

交換機的型別:

交換機主要包括如下4種型別:

direct exchange(直連交換機)

fanout exchange(扇型交換機)

topic exchange(主題交換機)

headers exchange(頭交換機)

另外rabbitmq預設定義一些交換機:

預設交換機

amq.* exchanges

還有一類特殊的交換機:dead letter exchange(死信交換機)

direct exchange(直連交換機)

直連型交換機(direct exchange)是根據訊息攜帶的路由鍵(routing key)將訊息投遞給對應佇列的,步驟如下:

將乙個佇列繫結到某個交換機上,同時賦予該繫結乙個路由鍵(routing key)

當乙個攜帶著路由值為r的訊息被傳送給直連交換機時,交換機會把它路由給繫結值同樣為r的佇列。

fanout exchange(扇型交換機)

扇型交換機(funout exchange)將訊息路由給繫結到它身上的所有佇列。不同於直連交換機,路由鍵在此型別上不啟任務作用。如果n個佇列繫結到某個扇型交換機上,當有訊息傳送給此扇型交換機時,交換機會將訊息的傳送給這所有的n個佇列

topic exchange(主題交換機)

主題交換機(topic exchanges)中,佇列通過路由鍵繫結到交換機上,然後,交換機根據訊息裡的路由值,將訊息路由給乙個或多個繫結佇列。

扇型交換機和主題交換機異同:

對於扇型交換機路由鍵是沒有意義的,只要有訊息,它都傳送到它繫結的所有佇列上

對於主題交換機,路由規則由路由鍵決定,只有滿足路由鍵的規則,訊息才可以路由到對應的佇列上

headers exchange(頭交換機)

類似主題交換機,但是頭交換機使用多個訊息屬性來代替路由鍵建立路由規則。通過判斷訊息頭的值能否與指定的繫結相匹配來確立路由規則。 

此交換機有個重要引數:」x-match」

當」x-match」為「any」時,訊息頭的任意乙個值被匹配就可以滿足條件

當」x-match」設定為「all」的時候,就需要訊息頭的所有值都匹配成功

rabbitmq預設定義一些交換機

在rabbitmq預設定義一些交換機,主要如下:

預設交換機 

預設交換機(default exchange)實際上是乙個由rabbitmq預先宣告好的名字為空字串的直連交換機(direct exchange)。它有乙個特殊的屬性使得它對於簡單應用特別有用處:那就是每個新建佇列(queue)都會自動繫結到預設交換機上,繫結的路由鍵(routing key)名稱與佇列名稱相同。

如:當你宣告了乙個名為」hello」的佇列,rabbitmq會自動將其繫結到預設交換機上,繫結(binding)的路由鍵名稱也是為」hello」。因此,當攜帶著名為」hello」的路由鍵的訊息被傳送到預設交換機的時候,此訊息會被預設交換機路由至名為」hello」的佇列中。

類似amq.*的名稱的交換機

這些是rabbitmq預設建立的交換機。這些佇列名稱被預留做rabbitmq內部使用,不能被應用使用,否則丟擲403 (access_refused)錯誤

dead letter exchange(死信交換機)

在預設情況,如果訊息在投遞到交換機時,交換機發現此訊息沒有匹配的佇列,則這個訊息將被悄悄丟棄。為了解決這個問題,rabbitmq中有一種交換機叫死信交換機。當消費者不能處理接收到的訊息時,將這個訊息重新發布到另外乙個佇列中,等待重試或者人工干預。這個過程中的exchange和queue就是所謂的」dead letter exchange 和 queue」

交換機的屬性

除交換機型別外,在宣告交換機時還可以附帶許多其他的屬性,其中最重要的幾個分別是:

name:交換機名稱

durability:是否持久化。如果永續性,則rabbitmq重啟後,交換機還存在

auto-delete:當所有與之繫結的訊息佇列都完成了對此交換機的使用後,刪掉它

arguments:擴充套件引數

RabbitMQ 交換機模式

在說正題之前先解釋一下交換機模式是個籠統的稱呼,它不是乙個單獨的模式 包括了訂閱模式,路由模式和主題模式 交換機模式是乙個比較常用的模式,主要是為了實現資料的同步。首先,說一下訂閱模式,就和字面上的意思差不多主要就是乙個生產者,多個消費者,同乙個訊息被多個消費者獲取,先看一下官網的圖示 整體執行過程...

rabbitmq 理論 主題交換機

儘管直連交換機能夠改善我們的系統,但是它也有它的限制 沒辦法基於多個標準執行路由操作。在我們的日誌系統中,我們不只希望訂閱基於嚴重程度的日誌,同時還希望訂閱基於傳送 的日誌。unix工具syslog就是同時基於嚴重程度 severity info warn crit.和 裝置 facility au...

RabbitMQ之Exchange交換機

rabbitmq中的exchange的作用 訊息佇列,訊息通過傳送和exchange之後最終到達的地方,到達queue的訊息及進入了等待消費的狀態。每個訊息都會被傳送到乙個或多個佇列。佇列的常用屬性name 佇列的名稱 durability 是否需要持久化,true為持久化 auto delete ...