RabbitMQ學習(八):AMQP 0-9-1 協議之Exchange

說明

通過上篇博文翻譯了RabbitMQ官方文檔關於AMQP協議介紹的一小部分,本篇博文將繼續翻譯有關AMQP協議的相關內容,主要記錄AMQP協議中Exchange實體相關知識,學習在RabbitMQ中Exchange的類型及其作用。

正文

Exchanges and Exchange Type

交換機是AMQP 0-9-1協議中的一種實體。在發送消息時,消息將被直接發送到該類實體中,並且交換機將對消息進行路由,路由到一個或多個隊列。使用的路由算法取決於交換機的類型,這裏RabbitMQ將路由規則也稱之爲綁定。AMQP 0-9-1協議提供了四種交換機類型,分別爲:

名稱 默認預先被創建時的名稱
Direct exchange amq.direct 和 (空字符串 默認的交換機)
Fanout exchange amq.fanout
Topic exchange amq.topic
Headers exchange amq.match (在RabbitMQ中爲amq.headers)

處理交換機的類型,在聲明交換機時也可以設置其他參數,以下列出幾個最重要的參數:

  • Name (交換機的名稱)
  • Durability(是否持久化,若爲true,交換機在服務器重啓後仍然存在)
  • Auto-delete (是否自動刪除,若爲true,當最後一個隊列不再綁定時,交換機將會被自動刪除)
  • Arguments (可選的其他參數,通常被用於插件或代理服務器的指定功能)

交換機可以是持久態的或者是瞬時態的。持久態的交換機在服務器重啓時仍可以存活,但是瞬時態不可以(當服務器重新上線時,它們必須被重新聲明)。並不是所有的使用場景都要求交換機時持久態的,根據實際情況進行設置。


Default Exchange

默認的交換機時一個沒有名字(空字符串)的Direct類型的交換機,他被代理服務器預先聲明創建。它的一個特殊屬性使其在簡單的應用程序中十分有用:每一個隊列被創建時都會自動與該交換機進行綁定,並且使用的路由關鍵字與隊列名稱相同。

例如,當你聲明瞭一個名爲“search-indexing-online”的隊列時,AMQP 0-9-1代理將會使用“search-indexing-online”作爲路由關鍵字(在本文中有時也指綁定關鍵字),將該隊列綁定到默認的交換機上。因此,當一個攜帶關鍵字值與隊列名稱相同的消息被髮送到該交換機時,交換機將會把該消息路由到與關鍵字同名稱的隊列中。換句話說,默認的交換機使得我們在發送消息時,好像是直接發送到隊列一樣,雖然在技術層面並沒有真正地發生。


Direct Exchange

一個direct類型的交換機基於消息的路由關鍵字將消息發送到隊列。該類型的交換機十分適用於消息的指定路由,實現單一傳播(雖然它也可以用來廣播路由)。以下是它的工作原理:

  • 一個隊列使用一個值爲“K”的路由關鍵字綁定到一個該類型交換機上
  • 當一個攜帶值爲“R”的路由關鍵字的新消息被髮送到該交換機時,交換機會判斷K和R是否相等,若相等則路由該消息到匹配的隊列

Direct交換機被經常用於以循環調度的方式在多個消費者(相同的程序實例)間派發任務。當以這種方式工作時,瞭解AMQP 0-9-1協議中的負載均衡是在消費者而不是隊列間就變得十分重要。

下圖表示了Direct交換機的工作原理:
在這裏插入圖片描述


Fanout Exchange

一個Fanout類型的交換機將忽略消息攜帶的路由關鍵字,以廣播的形式將消息發送到所有綁定到它的隊列中。如果有N個隊列綁定到一個fanout交換機,那麼當一個新消息被髮送到該交換機時,此交換機會向所有的隊列發送這個消息的副本。所以,Fanout類型交換機適用於消息的廣播發送。

因爲fanout交換機發送消息的副本到每個綁定它的隊列中,所以它的一些使用場景是十分相似的:

  • 在多人在線遊戲中,可以使用它來更新排行榜或者其他的全局事件
  • 體育新聞網站可以用它實時地將比分推送到移動端
  • 分佈式系統可以廣播各種狀態和配置更新
  • 羣聊時可以使用它在多個參與者間分發消息(AMQP沒有一個內置的概念,所以使用XMPP協議更好些)

下圖表示了Fanout交換機的工作原理:
在這裏插入圖片描述


Topic Exchange

Topic交換機將消息路由到一個或多個隊列,基於消息寫的路由關鍵字與隊列綁定表達式相匹配的路由規則。Topic類型的交換機經常被用於發佈/訂閱模式,通常用來實現消息的多路廣播。

Topic交換機有十分廣闊的使用場景:每當遇見多個消費者或者應用程序希望有選擇性的接收消息類型的問題時,就應該考慮使用該類型的交換機。

使用示例:

  • 發送與地理位置相關的數據,如銷售點
  • 多個工作者後臺處理任務,每個工作者只處理部分任務
  • 股票價格的更新或者其他金融數據的更新
  • 涉及到某種類型或標籤的新聞消息的更新(比如某種類型的運動或某支隊伍)
  • 雲服務中不同類型服務的協調
  • 分佈式架構或者是特定的軟件系統的構建或打包工作,每個構建者只能處理一個架構或者系統

Headers Exchange

Headers交換機被設計用來基於多個屬性進行消息路由,在消息頭表示多個屬性比在一個路由關鍵字中容易。Headers交換機在路由時將會從消息頭中取屬性值匹配路由而忽略路由關鍵字的值。當消息頭的屬性與綁定關鍵字相等時則任務該消息匹配,可以路由到指定隊列。

這裏存在綁定一個隊列到一個headers交換機時使用多個頭屬性進行匹配的可能性,這種情況下,代理服務器就需要從程序開發者獲取更多的配置信息,即消息是需要匹配任意一個屬性還是全部匹配。在綁定時可以通過“x-match”屬性進行設置,當該屬性值爲any時,則只需要任意一個頭屬性匹配就可以,當值爲all時,則頭屬性需要全部完全匹配。

Headers交換機可以看作是一種特殊的direct交換機。這是因爲它們是基於消息的頭部屬性進行路由,路由關鍵字不必是一個字符串,比如可能是一個數字或一個哈希表時,headers交換機就可以被當做一個direct交換機使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章