2012-10-31 93 views
0

我無法理解RabbitMQ中的路由。考慮我有幾個生產者(讓他們叫客戶端)產生消息到隊列中。例如,客戶端ABC發送消息到隊列X1RabbitMQ:從隊列中檢索特定消息

讓消費者響應所有發送響應的消息回隊列。例如,消費者從隊列X1獲得消息,做一些事情併發送響應給隊列X1

例如,客戶端A如何確定隊列中的哪個位置X1發送給它的消息以及消息發送到客戶端的位置BC

由於預計有大量連接(~10^6),我無法爲每個連接聲明一個隊列。所以我在這裏遇到麻煩了。有什麼建議麼?謝謝。

+1

我建議你刪除路由標記。您指的是MQ中的路由而不是網絡路由。它們不是一回事,標籤所指的路由是網絡路由。 – robthewolf

+0

我無法理解你的問題。我不確定X2與問題其餘部分的相關性,與DE和F類似。我也認爲您可能需要重新閱讀RabbitMQ網站上的教程,因爲只有在生產者發送和交換時路由才真正發生,消費者從綁定到該交換的隊列中消耗。 – robthewolf

+0

我讀了一堆關於AMQP和RabbitMQ本身的教程。要說清楚:忘記客戶'D','E','F'和隊列'X2'。三個客戶'A','B','C'用'amq.topic'類型向交易所發送消息。這三條消息路由到隊列'X1'。消費者處理所有消息並將響應發送回該交換機。響應隊列'X1'的路由。現在,三個客戶端中的每一個都需要從隊列中獲取消息。因此,客戶端'A'想要發送消息給它,客戶端'B' - 消費者發送給'B'的消息等。這可以怎麼做? – maverik

回答

2

我想你需要看看RPC教程。從你的描述來看,這聽起來就是你想要做的。但是,這可能會要求您聲明比您想要的隊列更多的隊列。

以不同的方式走近。我不明白你爲什麼會把答覆發回給製片人,不僅是由同一個交易所,而且是消費者消費的同一個隊列。

讓生產者P1,P2和P3發送路由鍵「abc.aaa.xyz」/「abc.bbb.xyz」/「abc.ccc.xyz」來交換X1是沒有意義的。然後有隊列Q1,Q2和Q3必將X1與結合鍵 「.aaa。」/ 「.bbb。」/ 「.ccc。」 或只是結合鍵Q1 「ABC。*。XYZ」 (我不清楚你想要什麼,所以只是提出一些建議)。消費者C1,C2和C3消費的是哪些消費者

當消費者完成消息處理後,它將發送消息給X2,並帶有標識自己的路由密鑰。生產者將從綁定到X2的隊列中消耗。

我試圖做的一點是,你不想讓一個以上的消費者從隊列中讀取數據。只有一種情況是你想要的,那是一個任務隊列。我不清楚你的用例,所以你可能需要一個任務隊列。如果你這樣做,你應該仍然沒有讓你的生產者從你的消費者那裏讀取同一個任務隊列。除了任務隊列,你應該有一個消費者從一個隊列中讀取數據。您可能有多個隊列進行一次交換,甚至有許多從一個隊列到一個交換的綁定。

我希望這有助於

+0

你的解決方案(有兩個交換機'X1','X2')是否需要擁有與客戶端數量一樣多的隊列?如果是,那麼它不適合我:預計有太多客戶。我沒有足夠的資源爲每個連接提供一個(或更多)隊列。如果否,我不明白兩個或多個客戶端如何從(唯一)隊列中獲取消息,將所有客戶端的消息放在一起。當然,我們可以得到消息,檢查它是否是我們的消息,如果不是,則將其推回隊列。回到這是我能想到的最糟糕的想法。 – maverik

+0

基本上你每個連接需要一個隊列。你如何確定你不能支持每個客戶端的一個隊列。如果您可以支持連接的客戶端,那麼您應該也可以爲它們支持一個隊列。 – robthewolf

+0

感謝您的幫助。 – maverik

相關問題