1

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

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

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

var _connection = amqp.createConnection(_options);

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

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

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

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

4

2 回答 2

2

您拥有的代码没有任何问题。这是一个很好的例子,说明如何让您的消息生成器保持美观、简单/干净。

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

消息消费者

消息消费者是执行实际工作的代码。它从它订阅的队列接收消息,并按照您告诉它的方式处理该消息。

这就是这里的关键——消息消费者将使用队列中的消息。如果要发送消息并对其进行处理,则必须有一个消息队列。

邮政系统类比

这样想:

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

RabbitMQ 中的消息传递也是如此。

您正在向目的地递送一封信。您在消息上写一个“地址”(交换名称和路由密钥),RabbitMQ 会计算出如何将其传递到适当的位置。

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

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

...

PS 如果你需要一些关于 RabbitMQ 和 NodeJS 的基础材料,请查看我的RabbitMQ For Developers包。通过最常见的 RMQ 问题和模式,您可以立即启动并运行。

于 2015-11-01T21:44:04.993 回答
0

队列被显式创建并绑定到交换,以确保发布的消息不会丢失,以防之前没有队列和绑定存在。

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

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

于 2015-10-31T20:12:51.237 回答