为什么在 RabbitMQ 发布中需要队列?

Why do I need a Queue in RabbitMQ publishing?

我正在使用 Node.js 和 node-amqp 创建一个简单的消息队列。我看到的大多数示例都执行以下操作:

  1. 创建连接
  2. 创建交易所
  3. 创建队列并将其绑定到 Exchange
  4. 通过 Exchange 发布

在我的代码中,我省略了队列(第 3 步),因为它不用于发布。

var _connection = amqp.createConnection(_options);

_connection.on('ready', function() {

    _connection.exchange('myexchange', { type: 'direct', autoDelete: false }, function(ex) {

        ex.publish({hello:'world'});
    });
});

这样可以吗?还是有排队的原因?

明确创建队列并绑定到交换以确保发布的消息不会丢失,以防先前不存在队列和绑定。

在 RabbitMQ 中,大多数关于实体创建(交换、队列、绑定)的操作都是幂等的。这意味着如果您使用相同的参数多次调用它们,它们将提供与调用一次相同的结果。

在交换的情况下,您不能发布到不存在的交换(发生通道级 AMQP 异常),但如果特定消息不存在适当的队列和绑定,它将丢失(或死信,请参阅Dead Letter Exchanges and Alternate Exchanges 更多)。

您的代码没有任何问题。这是一个很好的例子,说明如何让您的消息 生产者 简洁明了。

但是,您显示的代码只是消息传递解决方案的一半。如图所示,您需要消息生产者和消息消费者。

消息消费者

消息使用者是执行实际工作的代码。它从它订阅的队列接收消息,并按照您的指示处理该消息。

这里是关键 - 消息消费者将从队列中消费消息。如果你想发送一条消息并让它被处理,那么,你必须有一个消息队列。

邮政系统类比

这样想:

当你写一封信(笔和纸)时,你把它放在一个信封里。然后你在信封上写一个地址,然后通过你的邮政系统寄出。邮政系统知道地址的含义,通过各种卡车和邮件处理中心发送,最终将其放入收件人的邮箱。

这与 RabbitMQ 中的消息传递相同。

您正在向目的地投递一封信件。您在消息上写一个 "address"(交换名称和路由密钥),RabbitMQ 会计算如何将它传递到适当的位置。

对于实体邮件,您的信件会被放入邮箱以供他人阅读。使用 RabbitMQ 和消息传递,它会将您的消息放入队列中以供某些软件读取。

您需要一个队列,以便软件接收消息并进行处理。

...

P.S。如果您需要一些关于 RabbitMQ 和 NodeJS 的基础材料,请查看我的 RabbitMQ For Developers 包。它将让您立即 运行 了解最常见的 RMQ 问题和模式。