2013-01-23 32 views
1

我正好有2種類型的消息,我想通過RabbitMQ發送。所以,我有2個選項我怎麼可以這樣做:RabbitMQ交換:默認與直接

  • 發送消息到默認未命名的交流與routing_key相應的隊列名稱
  • 使用direct交換的對應消費者的routing_key參數隊列routing_key參數綁定

那麼哪個選項更可取?爲什麼?

回答

2

默認交換直接交流。 RabbitMQ默認創建默認交換,但它使用空字符串作爲名稱。如果你看一下RabbitMQ AMQP concepts page,在默認Exchange:

默認交換是沒有名字(空字符串),由經紀人 預先聲明的直接交流。

您可以通過運行rabbitmqctl list_exchanges也看到這一點:

   direct 
Foo    direct < Same thing as the above 
amq.direct  direct 
amq.fanout  fanout 
...and so on 

據我所知,沒有使用一個比其他任何好處。如果您只需要根據路由密鑰進行路由,我會堅持使用默認交換。

+2

說明@ making3的答案的另一種方式是默認交換是一種直接交換,所有隊列都隱式綁定到這個交換上,隊列名稱作爲路由鍵。當你創建一個隊列時,它將使用自己的名字綁定到默認交換。 – nitrogen

1

比方說,你直接綁定到交換廣播日誌路由的「信息」,「警告」和「錯誤」鍵。使用默認交換,您將需要創建三個不同的隊列與這些名稱接收所有日誌;並調整您收到的日誌級別需要更改您的隊列聲明。通過使用命名交換,您可以簡單地更改隊列的綁定並繼續處理事情。

總之,它提供了一個抽象一個額外的水平。

0

當我看到它,默認的直接交換得到的可能對消費者和生產者不知道對方的存在,由隊列(由消費者使用)結合的交換(由生產者使用)隱含使用隊列的名稱。

我使用默認的直接交換特定案例:消費者和生產者不知道對方的存在。就我而言,每個消費者都有適當的隊列。從製片人來看,我無法預先知道哪些隊列將被宣佈和使用,因爲這取決於消費者。因此,無法定義自定義直接交換和生產者隊列之間的綁定。 用自定義(用戶定義的)直接交換來解決它的一種方法是在消費者端定義綁定密鑰。但這意味着要從消費者那裏瞭解生產者,因爲我需要知道生產者使用的交換名稱。

因此,在默認的直接交換機上自動綁定一個隊列的名字,使得在我的情況下,只需要在消費者一方聲明一個隊列,並通過只知道隊列名稱從生產者發送消息給它。

當然,它意味着在調用生產者時知道隊列的名稱,因爲它需要知道自定義直接交換的綁定鍵(在我的情況下,隊列的名稱由使用生產者的應用程序)。但是,在配置經紀人時,生產者和消費者不必相互瞭解。