1. 程式人生 > 實用技巧 >Exchange型別

Exchange型別

交換機型別

# 預設交換機
預設交換機(default exchange)實際上是一個由訊息代理預先宣告好的沒有名字(名字為空字串)的直連交換機(direct exchange)。

它有一個特殊的屬性使得它對於簡單應用特別有用處:那就是每個新建佇列(queue)都會自動繫結到預設交換機上,繫結的路由鍵(routing key)名稱與佇列名稱相同。

舉個栗子:當你聲明瞭一個名為"search-indexing-online"的佇列,AMQP代理會自動將其繫結到預設交換機上,繫結(binding)的路由鍵名稱也是為"search-indexing-online"。因此,當攜帶著名為"search-indexing-online"的路由鍵的訊息被髮送到預設交換機的時候,此訊息會被預設交換機路由至名為"search-indexing-online"的佇列中。換句話說,預設交換機看起來貌似能夠直接將訊息投遞給佇列,儘管技術上並沒有做相關的操作。

channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')

直連交換機(direct),
直連型交換機(direct exchange)是根據訊息攜帶的路由鍵(routing key)將訊息投遞給對應佇列的。直連交換機用來處理訊息的單播路由(unicast routing)(儘管它也可以處理多播路由)。下邊介紹它是如何工作的:

- 將一個佇列繫結到某個交換機上,同時賦予該繫結一個路由鍵(routing key)
- 當一個攜帶著路由鍵為R的訊息被髮送給直連交換機時,交換機會把它路由給繫結值同樣為R的佇列。
直連交換機經常用來迴圈分發任務給多個工作者(workers)。當這樣做的時候,我們需要明白一點,在AMQP 0-9-1中,訊息的負載均衡是發生在消費者(consumer)之間的,而不是佇列(queue)之間。

扇型交換機(fanout)
扇型交換機(funout exchange)將訊息路由給繫結到它身上的所有佇列,而不理會繫結的路由鍵。如果N個佇列繫結到某個扇型交換機上,當有訊息傳送給此扇型交換機時,交換機會將訊息的拷貝分別傳送給這所有的N個佇列。扇型用來交換機處理訊息的廣播路由(broadcast routing)。

因為扇型交換機投遞訊息的拷貝到所有繫結到它的佇列,所以他的應用案例都極其相似:

  • 大規模多使用者線上(MMO)遊戲可以使用它來處理排行榜更新等全域性事件
  • 體育新聞網站可以用它來近乎實時地將比分更新分發給移動客戶端
  • 分發系統使用它來廣播各種狀態和配置更新
  • 在群聊的時候,它被用來分發訊息給參與群聊的使用者。(AMQP沒有內建presence的概念,因此XMPP可能會是個更好的選擇)
    • 主題交換機
  • 主題交換機(topic exchanges)通過對訊息的路由鍵和佇列到交換機的繫結模式之間的匹配,將訊息路由給一個或多個佇列。主題交換機經常用來實現各種分發/訂閱模式及其變種。主題交換機通常用來實現訊息的多播路由(multicast routing)。

    主題交換機擁有非常廣泛的使用者案例。無論何時,當一個問題涉及到那些想要有針對性的選擇需要接收訊息的 多消費者/多應用(multiple consumers/applications) 的時候,主題交換機都可以被列入考慮範圍。

    使用案例:

    • 分發有關於特定地理位置的資料,例如銷售點
    • 由多個工作者(workers)完成的後臺任務,每個工作者負責處理某些特定的任務
    • 股票價格更新(以及其他型別的金融資料更新)
    • 涉及到分類或者標籤的新聞更新(例如,針對特定的運動專案或者隊伍)
    • 雲端的不同種類服務的協調
    • 分散式架構/基於系統的軟體封裝,其中每個構建者僅能處理一個特定的架構或者系統。

頭交換機

有時訊息的路由操作會涉及到多個屬性,此時使用訊息頭就比用路由鍵更容易表達,頭交換機(headers exchange)就是為此而生的。頭交換機使用多個訊息屬性來代替路由鍵建立路由規則。通過判斷訊息頭的值能否與指定的繫結相匹配來確立路由規則。

我們可以繫結一個佇列到頭交換機上,並給他們之間的繫結使用多個用於匹配的頭(header)。這個案例中,訊息代理得從應用開發者那兒取到更多一段資訊,換句話說,它需要考慮某條訊息(message)是需要部分匹配還是全部匹配。上邊說的“更多一段訊息”就是"x-match"引數。當"x-match"設定為“any”時,訊息頭的任意一個值被匹配就可以滿足條件,而當"x-match"設定為“all”的時候,就需要訊息頭的所有值都匹配成功。

頭交換機可以視為直連交換機的另一種表現形式。頭交換機能夠像直連交換機一樣工作,不同之處在於頭交換機的路由規則是建立在頭屬性值之上,而不是路由鍵。路由鍵必須是一個字串,而頭屬性值則沒有這個約束,它們甚至可以是整數或者雜湊值(字典)等。