所有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
很酷,非常感谢! –