2017-04-19 55 views
0

我在ubuntu-16.04上使用pika-0.10.0rabbitmq-3.6.6 broker。我設計了一個請求/回覆服務。有一個請求隊列,所有客戶端都會推送他們的請求。每個客戶端創建一個唯一的應答隊列:服務器將針對此客戶端的應答推送到此唯一隊列。我的API可以看作兩條消息:initrun限制連接到兔子隊列的數量?

init消息包含大圖像,因此init是一個大而緩慢的請求。 run信息較輕,服務器重用以前的圖像。服務器可以爲多個客戶端服務。通常客戶#1 init然後run多次。如果客戶端#2進入並且init,它將替換服務器上的客戶端#1發送的圖像。客戶#1發佈的run會使用錯誤的圖片。然後我問:

  • 是否有可能限制連接到隊列的數量?例如服務器一次爲一個客戶端提供服務。
  • 另一種選擇是:服務器將圖像綁定到客戶端,保存它們,並在此客戶端運行時重新使用它們。它需要更多的工作,並且會在兩個或更多客戶端的請求被緊密交織時影響性能。
  • 發送圖像在每個運行請求不是一個選項,會太慢。

回答

1

我覺得你的設計有問題。邏輯上,每個run對應於某個init,因此它們必須連接。我會將相關ID字段放入initrun事件中。當服務器收到run時,它會檢查是否有相應的init已處理,並使用該結果init

說到性能: 你可以讓init工作隊列並讓多個處理服務器監聽它。該示例位於RabbitMQ docs 然後,當init請求進入時,其中一個可用服務器將撿起它,並存儲您的圖像和關聯ID。如果你有在同一時間多個init請求 - 沒問題,他們將最終被處理(或simultaneosly如果服務器是免費的)

然後就是做了處理服務器發送回覆信息傳送到客戶隊列說init工作完成後,併發送run請求必須發佈的隊列的名稱。

準備就緒後,客戶端將其run請求發送到正確的隊列。

直接回答這個問題:

還有就是你發佈到queue一種常見的誤解。在RabbitMQ中,您發佈到exchange,它關心將消息路由到多個隊列。所以你的問題真的變成了can I limit number of publishing connections to an exchange。我很確定經紀人方面沒有辦法這樣做。 即使有限制連接數的方式,想象一下這種情況:

  1. 客戶端1進來,推動其「初始化」的要求。
  2. Client1保持其連接,等待推送run
  3. 客戶端1發生故障或發生網絡分區,其連接丟失 。
  4. Client2進來並推送其init請求。
  5. 客戶端2失敗
  6. 客戶端1重新啓動並推送其run並獲取客戶端2的 圖像。

連接是一件短暫的事情,不能依賴於事務機制。

+0

這確實是一個好看的子彈#2的解決方案。不過,你知道是否可以限制到隊列的連接數量? –

+0

@ m-ric更新了 –