2017-07-11 27 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

很酷,非常感谢! –