全部產品
Search
文件中心

ApsaraMQ for RabbitMQ:Exchange

更新時間:Aug 01, 2024

本文介紹雲訊息佇列 RabbitMQ 版的Exchange的概念和類型,協助您理解和選擇Exchange。

什麼是Exchange

Exchange是雲訊息佇列 RabbitMQ 版的訊息路由代理。生產者向雲訊息佇列 RabbitMQ 版發送訊息時,不會直接將訊息發送到Queue,而是先將訊息發送到Exchange,由Exchange將訊息路由到一個或多個Queue。Exchange根據Routing Key和Headers屬性路由訊息。

Direct Exchange

  • 路由規則

    Direct Exchange根據Routing Key完全符合的規則路由訊息。

  • 使用情境

    Direct Exchange適用於通過簡單字元標識符區分訊息的情境。Direct Exchange常用於單播路由。

  • 匹配樣本

    Direct Exchange根據Routing Key完全符合的規則路由訊息的樣本如下:

    direct_exchange

    Message

    Routing Key

    綁定關係中的Routing Key

    Queue

    Message A

    img.create

    img.create

    Queue A

    Message B

    img.log

    img.log

    Queue B

Topic Exchange

  • 路由規則

    Topic Exchange根據Routing Key萬用字元匹配的規則路由訊息。Topic Exchange支援的萬用字元包括星號(*)和井號(#)。星號(*)代表一個英文單詞(例如cn)。井號(#)代表零個、一個或多個英文單詞,英文單詞間通過英文句號(.)分隔,例如cn.zj.hz。

  • 使用情境

    Topic Exchange適用於通過萬用字元區分訊息的情境。Topic Exchange常用於多播路由。例如,使用Topic Exchange分發有關於特定地理位置的資料。

  • 路由樣本

    Topic Exchange根據Routing Key萬用字元匹配的規則路由訊息的樣本如下:

    topic_exchange

    Message

    Routing Key

    綁定關係中的Routing Key

    Queue

    Message A

    files.cn.hz

    files.cn.hz.#

    Queue A

    Message B

    files.cn.hz.store

    • files.cn.hz.#

    • files.cn.*.store

    • Queue A

    • Queue B

    Message C

    files.cn.sz.store

    files.cn.*.store

    Queue B

Fanout Exchange

  • 路由規則

    Fanout Exchange忽略Routing Key的匹配規則將訊息路由到所有綁定的Queue。

  • 使用情境

    Fanout Exchange適用於廣播訊息的情境。例如,分發系統使用Fanout Exchange來廣播各種狀態和配置更新。

  • 路由樣本

    Fanout Exchange忽略Routing Key的匹配規則將訊息路由到所有綁定的Queue的樣本如下:

    fanout_exchange

    Message

    Routing Key

    綁定關係中的Routing Key

    Queue

    Message A

    img.create

    • files.cn.hz.#

    • queue.msgText

    • Queue A

    • Queue B

    Message B

    queue.msgMap

    • files.cn.hz.#

    • queue.msgText

    • Queue A

    • Queue B

    Message C

    cn.hz.topic.alarm

    • files.cn.hz.#

    • queue.msgText

    • Queue A

    • Queue B

Headers Exchange

  • 路由規則

    Headers Exchange可以被視為Direct Exchange的另一種表現形式。Headers Exchange可以像Direct Exchange一樣工作,不同之處在於Headers Exchange使用Headers屬性代替Routing Key進行路由匹配。您在綁定Headers Exchange和Queue時,可以設定綁定屬性的索引值對。然後,在向Headers Exchange發送訊息時,設定訊息的Headers屬性索引值對。Headers Exchange將根據訊息Headers屬性索引值對和綁定屬性索引值對的匹配情況路由訊息。

    匹配演算法由一個特殊的綁定屬性索引值對控制。該屬性為x-match,只有以下兩種取值:

    • all:所有除x-match以外的綁定屬性索引值對必須和訊息Headers屬性索引值對匹配才會路由訊息。

    • any:只要有一組除x-match以外的綁定屬性索引值對和訊息Headers屬性索引值對匹配就會路由訊息。

    以下兩種情況下,認為訊息Headers屬性索引值對和綁定屬性索引值對匹配:

    • 訊息Headers屬性的鍵和值與綁定屬性的鍵和值完全相同。

    • 訊息Headers屬性的鍵和綁定屬性的鍵完全相同,但綁定屬性的值為空白。

  • 使用情境

    Headers Exchange適用於通過多組Headers屬性區分訊息的情境。Headers Exchange常用於多播路由。例如,涉及到分類或者標籤的新聞更新。

  • 使用樣本

    Headers Exchange根據訊息Headers屬性和Binding Headers屬性的匹配規則路由訊息的樣本如下:

    headers_exchange

    Message

    訊息Headers屬性

    Binding Headers屬性

    Queue

    Message A

    type=read
    resource=group
    • type=read
      resource=group
      x-match=all
    • type=read
      resource=topic
      x-match=any
    • Queue A

    • Queue B

    Message B

    type=read
    type=read
    resource=topic
    x-match=any

    Queue B

    Message C

    type=write
    resource=topic
    type=read
    resource=topic
    x-match=any

    Queue B

x-delayed-message Exchange

雲訊息佇列 RabbitMQ 版還相容開源RabbitMQ以外掛程式形式支援的x-delayed-message Exchange。您無需安裝該外掛程式,只需聲明該類Exchange,並自訂訊息的Header屬性x-delay來指定訊息延時投遞的時間段,單位為毫秒。訊息將在x-delay定義的時間段後被投遞到對應的Queue。

  • 路由規則

    x-delayed-message Exchange根據擴充欄位x-delayed-type指定的Exchange類型確定路由規則。支援x-delayed-message的Exchange類型如下:

  • 使用情境

    x-delayed-message Exchange適用於需要延時投遞訊息的情境。更多資訊,請參見延時訊息

  • 使用樣本

    x-delayed-message Exchange根據x-delayed-type指定的Exchange類型的路由規則路由訊息。以x-delayed-type指定為Direct類型為例,Direct Exchange根據Routing Key完全符合的規則路由訊息的樣本如下:

    x-delayed-message-exchange

    Message

    x-delay

    Routing Key

    綁定關係中的Routing Key

    Queue

    Message A

    3000

    img.create

    img.create

    Queue A

    Message B

    4000

    img.log

    img.log

    Queue B

    訊息路由說明如下:

    • Message A到達Exchange後,x-delayed-message Exchange會在3000毫秒後將Message A投遞至Queue A。

    • Message B到達Exchange後,x-delayed-message Exchange會在4000毫秒後將Message B投遞至Queue B。

x-consistent-hash Exchange

雲訊息佇列 RabbitMQ 版相容開源RabbitMQ以外掛程式形式支援的x-consistent-hash Exchange。您無需安裝該外掛程式,只需聲明該類Exchange。

說明

x-consistent-hash Exchange暫不支援基於hash-property的方式進行路由,即不支援按照message id、correlation id、timestamp的方式計算雜湊路由。

  • 路由規則

    • x-consistent-hash Exchange支援基於Routing Key或Header值兩種方式進行路由。Exchange收到訊息後,會根據訊息的Routing Key或Header值進行Hash運算,由計算的Hash值決定訊息路由到哪個綁定的Queue中。

    • 同一Routing Key或Header值計算的Hash值相同,因此,相同Routing Key或Header值的訊息會被路由到同一個Queue中。

    • 使用Header值的方式進行路由匹配時,需要通過hash-header字串聲明Exchange、聲明要使用的Header。同時發布的訊息需要包含hash-header所選的Header,若未包含指定的Header,則全部訊息將被路由到同一個任意隊列中。

    • 若Routing Key和hash-header參數同時定義,則以hash-header參數值為輸入進行Hash運算。

    • x-consistent-hash Exchange綁定Queue時,Routing Key需要設定為1~20的數字,表示該Queue的權重。數值越大權重越大,分發訊息時接收到的訊息越多。

    • 當Queue的Routing Key大於20時,權重會視為20。

    • 當存在重複綁定時,只有第一個符合要求的綁定(綁定值為正整數)有效;修改Queue的權重時,請先刪除已有的綁定關係。

  • 使用情境

    x-consistent-hash適合按照權重對訊息進行劃分的情境。

  • 使用樣本

    x-consistent-hash Exchange根據訊息的指定方式計算雜湊進行路由。Exchange上綁定有不同權重的Queue,並根據Queue的權重將訊息分發到不同的Queue中。本樣本以基於Routing Key方式計算路由規則為例。

    x-consistent-hash

    Message

    Routing Key

    Message A

    cn.hz.1

    Message B

    cn.hz.2

    Message C

    cn.hz.3

    Queue

    綁定關係中的Routing Key

    Queue A

    1

    Queue B

    2

    路由說明如下:

    • Message A、Message B、Message C到達Exchange後,將按照其Routing Key計算雜湊值,並按照雜湊值投遞到Queue中。

    • Exchange分別綁定了Queue A和Queue B,且權重為1和2,因此訊息將按照1∶2的權重路由到Queue A和Queue B中。