2015-07-21 89 views
3

我與我的同事在Server AServer B之間討論RabbitMQ設計,這裏是流程圖如下。是否應該在RabbitMQ中多次聲明交換或隊列?

enter image description here

Server A通過exchange AQueue B將消息發送到Server B,並從通過Server BQueue A接收消息。反之亦然Server B

Server A中有兩個類,用C++實現;一個是sender,另一個是receiver。使用JavaScript實現的Server B的代碼結構相同。

對於senderreceiverServer A。我的同事的想法是:

  • 在發件人的初始化:
    • 創建rabbitmq
    • 連接聲明exchange A
    • 聲明Queue B
    • 綁定的關鍵是Queue B
  • 最初化在接收器:
    • 創建rabbitmq
    • 連接聲明exchange B
    • 聲明Queue A
    • 結合的關鍵Queue A

同樣的邏輯在Server B

不過,我不認爲Queue BExchange B應該在Server A聲明。它們應在Server B中聲明。

最後,我遵循我的同事的想法實施它,因爲他之前做過一些相關的工作。


今天,Server A在功能amqp_queue_declareSender模塊測試期間掛起,但重新啓動後RabbitMQ效果很好。所以我懷疑我的同事想要初始化Sender

我的想法:

  • Server A
    • 在發件人
      • 創建rabbitmq
      • 連接的初始化聲明Exchange A
    • 在接收器中的初始化
      • 創建rabbitmq
      • 連接創建Queue A
      • 結合的關鍵Queue A
  • Server B
    • 在發件人初始化
      • 創建rabbitmq
      • 連接聲明Exchange B
    • 初始化在接收機
      • 創建rabbitmq
      • 連接創建Queue B
      • 結合的關鍵Queue B

有人能告訴我有什麼不對我的想法?還是有更好的解決方案?


編輯:從@Sigismondo

  • 回答問題做所有需要被交付給消費者A/B的消息?

    沒有

  • 沒有消費者A/B需要的情況下,通知的一些消息是失去了什麼?

    不,我想知道消費者A如何知道消息丟失了?

  • 在消費者A/B無法到達的情況下,預期行爲是什麼?

    如果消費者A不可達,則生產者B不會向A發送任何消息,反之亦然。 B怎麼可能知道消費者A不可及?

    目前,在我的系統中,每條消息都有缺陷。所以B在前一種情況下不能從A得到答覆,則B不會將消息發送給A.

  • 如果生產者A/B停機,預期行爲是什麼?

    如果生產商B是下跌,那麼A將不會收到來自B.所以任何消息將不會發送任何信息給B.

+0

「目前,在我的系統中,每條消息都有缺陷」。你的意思是RabbitMQ/AMQP標準,不是嗎? – Sigismondo

+0

@Sigismondo不是amqp標準ack,在我自己的系統中定義的ack消息。 – zangw

+0

我明白了。你的問題不能被歸類爲「RPC-over-messaging」,如這裏舉例說明的那樣? https://www.rabbitmq.com/tutorials/tutorial-six-python.html – Sigismondo

回答

3

這是完全合法的,這兩個服務器的申報隊列和交換,在處理指定隊列時通常是首選方法:通常是您希望生產者和消費者分離,並讓隊列和交換都聲明(即:創建,如果缺少),您讓兩者都正確工作,並且您擁有即使在RabbitMQ全新安裝中,也保證不會丟失任何消息,以防對方尚未啓動。

尤其是很重要的:

  • 消費者宣佈,從必須消費信息(或將不能夠從他們那裏消費)隊列。

  • 生產者聲明隊列的交流於此,它產生之前產生消息(否則將被丟失,在沒有的情況下消費者已經創建了隊列)。

這是使用命名隊列時使用的典型方法,看起來你在這裏做什麼。

現在,如果您希望在消費者不在的情況下忘記消息,那麼生產者將不會聲明任何隊列:消費者可以創建temporary queue並將其綁定到交易所。

最後,如果是這種情況,並且您希望在沒有消費者的情況下收到通知(並且沒有綁定到交換機的隊列),則可以使用alternate exchanges

所以,你會看到:有一些選項可以使用,但每個選項都有一個基本原理:你必須根據具體問題選擇使用哪一個 - 而且這還沒有被你的解釋:即使非常詳細,它缺少一些方面:

  • 做所有消息需要傳遞給消費者的A/B?
  • 消費者A/B是否需要通知,以防一些消息丟失?
  • 消費者A/B無法到達的情況下的預期行爲是什麼?
  • 如果生產商A/B出現故障,預期行爲是什麼?

然而amqp_queue_declare不應該掛在所有的:如果這是你面臨的一個錯誤的情況下,或我不知道,但這不是它的預期的行爲,據我所知。

+0

感謝您的回答,我在我的問題中回答了您的問題 – zangw

相關問題