所有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)
);
謝謝!目前,我正在爲不相關的工作(稱爲'media'和'bookings')設置兩個不同的隊列,這兩個隊列都鏈接到一個(直接路由)交換,並通過專用路由鍵將所有可能的工作任務綁定到兩個隊列中的任何一個。那有意義嗎?還是有更好的方法將任務映射到特定的隊列(可能使用主題)? –
是的,只要您希望將消息路由到一個單一隊列,就是有意義的。如果您希望將消息發送到許多不同的隊列,那麼許多服務可以訂閱一項工作,但話題交換可能會很好。例如,當你有多個服務/工作人員需要對單個消息採取不同的行動時。 – Johansson
很酷,非常感謝! –