回答問題:我是否希望所有隊列都能收到所有消息?
如果答案是肯定的,那麼你應該使用扇出。如果答案是否定的,那麼你應該使用直接或主題。直接或主題的要點是隊列本身只會根據路由密鑰與綁定密鑰的匹配來接收消息。
隊列A應該由消費者C1實例化,並設置爲自動刪除且不耐用。當C1斷開隊列時,這種方式將被刪除,消息將被丟棄。
相反,當交換單獨或由生產者交換時,隊列B和C應該被實例化。應該設置爲非自動刪除並可能持久。如果您使用的是持久隊列,則可能需要持久消息(如果隊列A不存在,請不要擔心,即使持久消息在這裏也不會成爲問題)。這種方式一旦生產者開始發送消息,隊列將開始排隊,並且不會丟失消息,即使消費者尚未運行。
是否使用直接或話題交換是個人偏好。我知道直接交換應該更快,而話題交換允許路由/綁定密鑰具有很大的靈活性。
我不是100%你最後一個問題的意思。每條消息只能寫入一次交換。如果使用扇出,交換機將負責將消息正確地路由到隊列,就是這樣。如果您正在使用直接或主題交換,那麼將其交給綁定鍵以確保每個隊列都收到正確的消息。您不需要發送帶有多個路由鍵的消息,如果您希望做類似的事情,那麼您在理解時會有一些倒退。但是您可以從單個隊列獲得多個綁定密鑰到交換機。
簡單的例子。 X是直接交換。 B具有綁定鍵黑色,C具有一個黑色綁定鍵和一個白色綁定鍵。 P用黑色或白色的路由鍵發送消息。如果它是黑色的,那麼B和C都會收到消息,如果它是白色的,那麼只有C會收到消息。
生產者是否可以創建隊列?會不會引入耦合? –
是否有可能有幾個消費者連接到B和C,並只處理每個消息一次? (我的意思是,如果B上有兩個消費者,則消息僅由其中的一個處理) –
技術上,消費者創建隊列沒有問題。但它是一個具體的用例,我上面描述的那個。這取決於,如果您希望隊列從一開始就處於活動狀態,您可以手動創建一次。鑑於它與製片人一樣容易創作。我在這裏看不到什麼大問題。 – robthewolf