Exchange
本文介紹云消息隊列 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完全匹配的規則路由消息的示例如下:
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通配符匹配的規則路由消息的示例如下:
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的示例如下:
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屬性的匹配規則路由消息的示例如下:
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完全匹配的規則路由消息的示例如下:
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方式計算路由規則為例。
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中。