所有官方RabbitMQ示例都在消费者中设置队列和绑定.在发布/订阅教程指出,
如果没有队列绑定到交换机,消息将会丢失,但这对我们没有问题; 如果没有消费者在听,我们可以安全地丢弃该消息.
这对我来说绝对不行,因为我在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)
);
Run Code Online (Sandbox Code Playgroud)
是的,您可以在发布者中声明队列和交换。那里有许多RabbitMQ用例,用户将RabbitMQ用作作业工人队列。如果队列和交换不存在,则将对其进行声明和创建。(RabbitMQ不允许您使用不同的参数重新定义现有队列,并且将向尝试执行此操作的任何程序返回错误。)
我建议您在运行时定义它们,在应用程序实例启动时(或在需要队列/交换时)进行基本的交换/队列/路由设置。为了确保RabbitMQ永不丢失您的队列,您需要将其声明为持久的。请记住,要确保消息不会丢失,需要做两件事:我们需要将队列和消息都标记为持久性。(https://www.cloudamqp.com/blog/2017-03-14-how-to-persist-messages-during-RabbitMQ-broker-restart.html)