RabbitMQ一个消费者/一个发布者模式

时间:2018-05-07 01:52:39

标签: node.js rabbitmq

我有点困惑/困惑。我一直在阅读RabbitMQ的最佳实践,并且有很多文章说明你应该有两个连接 - 一个为订阅者分开,一个为你的发布者。

所以我最终做的事情基本上就是启动我的服务器:

    amqp.connect(RABBIT_URL, (err, conn) => {
        conn.createChannel((ampqErr, subscribingChannel) => {
            // .....
    })

    amqp.connect(RABBIT_URL, (err, conn) => {
        conn.createChannel((ampqErr, publishingChannel) => {
            // .......
    });

...但我99%确定这不是正确的方法。所以这就是我的第一个问题。如何在一个服务中维护此规则?

此外,在完成任务(即完成抓取页面)之后,它并没有真正解决,在该事件结束时,我需要触发一个触发解析的事件在另一个服务。我差不多做了

    ch.publish(...)

在我执行ack之前。这并不纯粹,因为我现在只有消费的渠道是发布事件来触发其他服务的解析。

此类事件/行动'订单继续通过其他2项服务 (1. web / app - > 2. scrape - > 3. parse - > 4. analytics)

我的计划是在每项服务完成后触发事件。这是正确的方法吗?

我想有两个问题。

谢谢..谢谢你...非常感谢能在这里帮助我的人。整个周末都在瞎逛。 :(

1 个答案:

答案 0 :(得分:0)

  

我一直在阅读RabbitMQ最佳实践,并且有很多文章指出您应该建立两个连接-一个与订阅者分开,一个与发布者分开。

作为最佳实践,多个连接和通道不一定能很好地转换为Node,因为事件循环是单线程的,因此除非您使用子进程或其他某种形式,否则打开多个通道不会带来任何实际好处。线程,可以一次使用两个通道。

  

此外,由于在完成任务(即完成对页面的抓取)之后,该事件并没有真正解决,在该事件结束时,我需要触发一个事件,该事件将触发另一个服务中的解析。我几乎在做ch.publish(...)   在我确认之前。这不是纯粹的,因为我本来仅用于消费的渠道现在正在发布事件以触发其他服务的解析。

如果您使用的是单个通道,这并不是真正的问题,正如我之前提到的,在Node中并不是真正的问题。

  

我的计划是在每次服务完成后触发一个事件。这是正确的方法吗?

我认为这种方法没有问题,并且已经在我自己的Node微服务中广泛使用了它。 Rabbit是一个非常健壮和灵活的系统,每个人的体系结构都将取决于他们自己的应用程序/服务需求。