2014-05-07 90 views
3

我爲RPC工作負載配置了一個名爲「ex_foo」的rabbitmq扇出交換。當客戶端連接到服務器時,他們創建自己的非持久RPC接收隊列並使用BasicConsumer連接到它。這些應用程序偵聽消息/命令並響應請求中reply_to部分中定義的隊列。等待fanfan交換所有rabbitmq響應?

一個簡單的消息/命令我發送出扇出交換(並且因此,連接到它的每個應用程序/客戶端)是一種類型的Ping請求消息的,我的問題是,我不的不知道我會得到多少ping響應(或者應該期望),因爲我不知道有多少客戶端在任何時候都連接到扇出交換機。所有連接到扇出交換機的客戶端都應答覆。

如果在扇出交換中傳遞給10個隊列(即:10個客戶端已連接),我如何知道預期會有多少響應?爲了知道這一點,我需要知道它交付了多少次?有沒有更復雜的睡眠計時器?簡單地說,我的管理工具不能無限期地等待,並且必須在收回所有ping(或超時已過)後退出。

+0

你可以把那些沒有響應的那些視爲「失望」嗎? –

+0

當然,如果一個節點沒有響應它關閉。但是一個ping請求會產生很多ping回覆,如果我只睡10秒,看看有多少響應,看起來很糟糕,例如,如果每個節點在1秒內響應。 – xconspirisist

+0

我並不覺得這很糟糕;你等待一段時間,如果在那段時間內沒有迴應,它就會降低< - 對我來說聽起來很明智.. –

回答

5

你在找什麼東西就像一個Scatter-Gather(http://www.eaipatterns.com/BroadcastAggregate.html)模式,不是嗎?

你不知道綁定到扇出的消費者,使您可以:

  1. 實施保活使用例如其中生成綁定的隊列中的消費者(或多個)。 如果您沒有收到消息,您可以考慮離線消費者,每個消費者每隔一秒發送一次保持活動狀態。
  2. 使用消費者註冊的內存數據庫(始終保持活動狀態)。
  3. 使用HTTP API知道綁定到扇出的消費者名單,以這種方式:

http://rabbitmqip/vhost/yourfanout/bindings/source,結果是這樣的:

[{"source":"yourfanout","vhost":"/","destination":"amq.gen-xOpYc8m10Qy1s4KCNFCgFw","destination_type":"queue","routing_key":"","arguments":{},"properties_key":"~"},{"source":" yourfanout","vhost":"/","destination":"myqueue","destination_type":"queue","routing_key":"","arguments":{},"properties_key":"~"}] 

一旦算你知道消費者回複數。

在發送請求之前調用API。

備註最後一個只有在使用綁定到使用者的臨時隊列時才能工作。

,我發現這個資源,可以幫助你(http://geekswithblogs.net/michaelstephenson/archive/2012/08/06/150373.aspx

我不知道到底是你的最終範圍,但保持活動可以等待最多前一秒決定,如果消費者是活的。

+0

http-api的答案很順利。 – granadaCoder