gpt4 book ai didi

rabbitmq - 在哪里设置交换器和队列(生产者与消费者)的绑定(bind)?

转载 作者:行者123 更新时间:2023-12-02 23:34:36 26 4
gpt4 key购买 nike

所有official RabbitMQ examples消费者中设置队列和绑定(bind)。 Publish/Subscribe tutorial指出

The messages will be lost if no queue is bound to the exchange yet, but that's okay for us; if no consumer is listening yet we can safely discard the message.

这对我来说绝对不行,因为我正在 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)
);

最佳答案

是的,您可以在发布者中声明队列和交换器。有很多 RabbitMQ 用例,用户使用 RabbitMQ 作为作业工作队列。如果队列和交换器尚不存在,则将声明和创建它们。 (RabbitMQ 不允许您使用不同的参数重新定义现有队列,并将向任何尝试执行此操作的程序返回错误。)

我建议您在运行时定义它们,在应用程序实例启动时(或需要队列/交换时)进行基本的交换/队列/路由设置。为了确保 RabbitMQ 永远不会丢失队列,您需要将其声明为持久队列。请记住,要确保消息不丢失,需要做两件事:我们需要将队列和消息标记为持久的。 (https://www.cloudamqp.com/blog/2017-03-14-how-to-persist-messages-during-RabbitMQ-broker-restart.html)

关于rabbitmq - 在哪里设置交换器和队列(生产者与消费者)的绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45031418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com