2012-09-26 28 views
13

使用RabbitMQ發送消息時,基本上有交換,隊列和綁定。我瞭解他們的想法以及他們如何相互關聯,但我不確定是誰設置了什麼。RabbitMQ:交換,隊列和綁定 - 誰設置了什麼?

基本上,我在我的應用程序中有三種情況。

情景1:一個出版商,幾個工作進程

我想達到的目標是,將消息發送到隊列中的一個組成部分,而且應是處理在隊列中的項目數工作進程。這對我來說似乎很容易。設置如下:

  • 交換:1個隊列
  • 裝訂::每當消息隊列被綁定到交換

與類型「直接」

  • 隊列1個交換髮送到交換機,它被傳送到隊列中,並且工作進程獲得他們的任務。

    一切都應該是持久的。

    那麼誰設置了什麼?在我看來:

    • 生產者創造交流
    • 生產者創建隊列(因爲目前可能沒有運行工作進程,如果沒有隊列中的消息,否則會被丟失)
    • 製作者的結合隊列交換
    • 消費者的隊列

    權只是聽?

    場景2:一個出版商,幾個用戶,揮發性消息

    第二種情況是完全不同的。基本上,這是一個pub/sub場景,每條消息都發送給每個當前正在監聽的客戶端。如果客戶端脫機,它不會再收到消息,並且他們也不會存儲在任何地方。這意味着以下設置:

    • 交換:與類型「扇出」
    • 隊列1個交換:n個隊列,每個消費者
    • 裝訂:每個隊列需要綁定到交換

    那麼誰設置了什麼?在我看來:

    • 生產者創造交流
    • 消費者創建隊列(因爲它是它自己的隊列,生產者無法知道誰是感興趣的消息)
    • 消費者創建其隊列結合交流
    • 消費者監聽到自己的隊列

    ,對嗎?

    方案3:如果一個消費者下線一個出版商,幾個用戶,持久的消息

    基本上相同場景2,但該消息應該不會丟失。在我看來,這不應該改變任何東西 - 對嗎?

  • +0

    還有第三個可用於設置的角色:外部管理員。有關更多信息,請參閱此答案的另一個問題:http://stackoverflow.com/questions/6148381/rabbitmq-persistent-message-with-topic-echange/6155733#6155733 –

    +0

    我沒有明確寫出,但系統應無需外部管理員即可獨立運行。 –

    回答

    5

    我覺得你說的是對的,除了在場景3.

    如果如果消費者已經下線,那麼你需要持久的隊列,隊列不能auto_delete'd消息應該不會丟失。

    其他一切似乎對我來說。

    在場景2的情況下,您還可以讓RabbitMQ爲您自動生成隊列名稱,然後讓這些隊列在消費者斷開連接後自動刪除。

    +0

    非常感謝:-)! –

    相關問題