2017-07-11 61 views
2

所有official RabbitMQ examples消費者中設置隊列和綁定。該Publish/Subscribe tutorial指出,如果沒有隊列綁定到交換尚未在哪裏設置交換和隊列(生產者與消費者)的綁定?

的消息將丟失,但是這沒關係 我們;如果沒有消費者正在收聽,我們可以放心地丟棄消息。

這對我來說絕對不行,因爲我在RabbitMQ之上實現了一個工作員隊列,當消費者還沒有運行時,不丟失任何消息是很重要的。因此,我正在考慮在生產者中建立交換< - >隊列路由。這些例子是否有其他的原因呢?

另一方面,每次連接到RabbitMQ服務器或只是一次(永遠)基本配置RabbitMQ實例時,是否認爲最佳做法是進行基本的交換/隊列/路由設置?我現在發佈消息的做法目前看起來有點像這樣:

const getChannel =() =>  
    ampq.connect() // The real implementation caches the connection 
    .then(conn => conn.createChannel()) 
    .then(channel => channel.assertExchange(...) 
     .then(() => channel.assertQueue(...)) // Assert and bind for all queues 
     .then(() => channel.bindQueue(...)) // Assert and bind for all queues 
    ); 

const publish = (task, payload) => 
    getChannel().then(channel => 
    channel.publish(exchange, task, payload) 
); 

回答

3

是的,你可以在你的發行申報隊列和交流。在那裏有很多RabbitMQ用例,用戶使用RabbitMQ作爲工作人員隊列。如果隊列和交換不存在,隊列和交換將被聲明和創建。 (RabbitMQ不允許您重新定義具有不同參數的現有隊列,並會向任何試圖執行該操作的程序返回錯誤。)

我建議您在運行時定義它們,執行基本交換/隊列/應用程序實例啓動時(或需要隊列/交換時)的路由設置。爲了確保RabbitMQ永不丟失隊列,你需要聲明它是持久的。請記住,需要確保消息不會丟失,因此需要做兩件事:我們需要將隊列和消息標記爲持久。 (https://www.cloudamqp.com/blog/2017-03-14-how-to-persist-messages-during-RabbitMQ-broker-restart.html

+1

謝謝!目前,我正在爲不相關的工作(稱爲'media'和'bookings')設置兩個不同的隊列,這兩個隊列都鏈接到一個(直接路由)交換,並通過專用路由鍵將所有可能的工作任務綁定到兩個隊列中的任何一個。那有意義嗎?還是有更好的方法將任務映射到特定的隊列(可能使用主題)? –

+1

是的,只要您希望將消息路由到一個單一隊列,就是有意義的。如果您希望將消息發送到許多不同的隊列,那麼許多服務可以訂閱一項工作,但話題交換可能會很好。例如,當你有多個服務/工作人員需要對單個消息採取不同的行動時。 – Johansson

+0

很酷,非常感謝! –