首页 文章

在哪里 Build 交换和队列( 生产环境 者与消费者)的绑定?

提问于
浏览
3

所有official RabbitMQ examples都在 consumer 中设置了队列和绑定 . Publish/Subscribe tutorial说明了这一点

如果没有队列绑定到交换机,消息将会丢失,但这对我们没有用;如果没有消费者在听,我们可以安全地丢弃该消息 .

这对我来说绝对不行,因为我已经运行了.656326_t . 因此,我正在考虑在 producer 中 Build 交换< - >队列路由 . 有没有理由说这些例子反过来呢?

顺便说一句,每次连接到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)
  );

1 回答

  • 4

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

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

相关问题