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

Tob*_*mer 5 amqp rabbitmq

所有官方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)

Lov*_*son 5

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

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

  • 是的,只要您希望将邮件路由到一个队列中就可以了。如果您希望将消息发送到许多不同的队列,其中许多服务可以预订一份工作,那么主题交流可能会很好。例如,当您有多个服务/工作人员需要对一条消息采取不同的操作时。 (2认同)