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

时间:2015-10-31 19:23:01

标签: node.js rabbitmq node-amqp

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

  1. 创建连接
  2. 创建交换
  3. 创建队列并将其绑定到Exchange
  4. 通过Exchange发布
  5. 在我的代码中,我省略了队列(步骤3),因为它不用于发布。

    var _connection = amqp.createConnection(_options);
    
    _connection.on('ready', function() {
    
        _connection.exchange('myexchange', { type: 'direct', autoDelete: false }, function(ex) {
    
            ex.publish({hello:'world'});
        });
    });
    

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

2 个答案:

答案 0 :(得分:2)

您拥有的代码没有任何问题。这是一个很好的例子,说明如何使您的消息 producer 保持简洁/干净。

但是,您显示的代码只是消息传递解决方案的一半。您需要消息生成器(如图所示)和消息使用者。

消息使用者

消息使用者是完成实际工作的代码。它从订阅它的队列接收消息,然后处理该消息但是告诉它。

这是密钥,在这里 - 消息使用者将使用队列中的消息。如果要发送消息并对其进行处理,则必须有一个消息队列。

邮政系统类比

这样想:

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

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

您正在向目的地发送信件。您在消息上写了一个“地址”(交换名称和路由键),RabbitMQ会找出如何将它传递到适当的位置。

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

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

...

P.S。如果您需要RabbitMQ和NodeJS上的一些基础材料,请查看我的RabbitMQ For Developers包。它可以让您立即启动并运行最常见的RMQ问题和模式。

答案 1 :(得分:0)

显式创建队列并绑定进行交换,以确保在以前没有队列和绑定存在的情况下不会丢失已发布的消息。

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

如果是交换,则无法发布到不存在的交换(发生通道级AMQP异常),但如果特定消息不存在正确的队列和绑定,则它将丢失(或以字母为单位,请参阅{{ 3}}和Dead Letter Exchanges了解更多信息。)