1. 程式人生 > >中介軟體系列三 RabbitMQ之交換機的四種類型和屬性

中介軟體系列三 RabbitMQ之交換機的四種類型和屬性

                                        <div class="markdown_views prism-atom-one-dark">
                        <!-- flowchart 箭頭圖示 勿刪 -->
                        <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
                        <h2 id="概述"><a name="t0"></a>概述</h2>

本文介紹RabbitMQ中交換機型別和屬性,主要內容如下:

  1. 交換機的作用
  2. 交換機的型別:Direct exchange(直連交換機)、Fanout exchange(扇型交換機)、Topic exchange(主題交換機)、Headers exchange(頭交換機)、預設存在的交換機、Dead Letter Exchange(死信交換機)
  3. 交換機的屬性

交換機的作用

之前的例子中,我們是通過佇列傳送和接收訊息的,但是實際上裡面還有一個重要的組合交換機,完整訊息流程如下: 這裡寫圖片描述

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

  • 將訊息傳送到特定的佇列
  • 有可能傳送到多個佇列中
  • 也有可能丟棄訊息

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

  • 生產者:傳送訊息
  • 交換機:將收到的訊息根據路由規則路由到特定佇列
  • 佇列:用於儲存訊息
  • 消費者:收到訊息並消費

交換機的型別:

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

  1. Direct exchange(直連交換機)
  2. Fanout exchange(扇型交換機)
  3. Topic exchange(主題交換機)
  4. Headers exchange(頭交換機)

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

  • 預設交換機
  • amq.* exchanges

還有一類特殊的交換機:Dead Letter Exchange(死信交換機)

Direct exchange(直連交換機)

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

  1. 將一個佇列繫結到某個交換機上,同時賦予該繫結一個路由鍵(routing key)
  2. 當一個攜帶著路由值為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:擴充套件引數