我使用带有node-amqp的Node.js来创建一个简单的消息队列。我看到的大多数示例都执行以下操作:
在我的代码中,我省略了队列(步骤3),因为它不用于发布。
var _connection = amqp.createConnection(_options);
_connection.on('ready', function() {
_connection.exchange('myexchange', { type: 'direct', autoDelete: false }, function(ex) {
ex.publish({hello:'world'});
});
});
这可以吗?还是有队列的原因?
答案 0 :(得分:2)
您拥有的代码没有任何问题。这是一个很好的例子,说明如何使您的消息 producer 保持简洁/干净。
但是,您显示的代码只是消息传递解决方案的一半。您需要消息生成器(如图所示)和消息使用者。
消息使用者是完成实际工作的代码。它从订阅它的队列接收消息,然后处理该消息但是告诉它。
这是密钥,在这里 - 消息使用者将使用队列中的消息。如果要发送消息并对其进行处理,则必须有一个消息队列。
这样想:
当你写一封信(笔和纸)时,你把它放在一个信封里。然后你在信封上写一个地址,并通过你的邮政系统发送。邮政系统知道地址的含义,通过各种卡车和邮件处理中心发送,并最终将其放入收件人的邮箱中。
RabbitMQ中的消息传递也是如此。
您正在向目的地发送信件。您在消息上写了一个“地址”(交换名称和路由键),RabbitMQ会找出如何将它传递到适当的位置。
使用实体邮件,您的信件会放在邮箱中供有人阅读。使用RabbitMQ和消息传递,您将消息放入队列中以供某些软件读取。
您需要一个软件队列来接收消息并对其进行处理。
...
P.S。如果您需要RabbitMQ和NodeJS上的一些基础材料,请查看我的RabbitMQ For Developers包。它可以让您立即启动并运行最常见的RMQ问题和模式。
答案 1 :(得分:0)
显式创建队列并绑定进行交换,以确保在以前没有队列和绑定存在的情况下不会丢失已发布的消息。
在RabbitMQ中,关于实体创建(交换,队列,绑定)的大多数操作都是幂等的。这意味着如果使用相同的参数多次调用它们,它们将提供与调用一次相同的结果。
如果是交换,则无法发布到不存在的交换(发生通道级AMQP异常),但如果特定消息不存在正确的队列和绑定,则它将丢失(或以字母为单位,请参阅{{ 3}}和Dead Letter Exchanges了解更多信息。)