【问题标题】:RabbitMQ & NodeJS: Following '1 connection per app, 1 channel per thread, 1 consumer per channel' guidelineRabbitMQ 和 Node JS:遵循“每个应用程序 1 个连接,每个线程 1 个通道,每个通道 1 个使用者”指南
【发布时间】:2017-04-16 00:54:42
【问题描述】:

我正在使用 NodeJS 和 amqplib 构建一个简单的作业队列库(有点类似于 Jackrabbit) 用于应该解析包含许多不同事件信息的相当大的提要的服务。

信息被解析后,被分发到数千个队列中(队列是必须遵守消息顺序的最小单位),然后由我的队列库使用。

问题是:在这种情况下,我如何遵循“每个应用程序 1 个连接、每个线程 1 个通道、每个通道 1 个使用者”指南?这会导致产生数千个进程,浪费大量内存和资源。

注意:每个队列中的消息数量不是很高:最多大约 1-2 msg/sec

【问题讨论】:

标签: node.js rabbitmq amqp


【解决方案1】:

我假设您知道 NodeJS 在运行代码时是单线程的,这就是您的问题的来源......

在基于线程的语言中,“每个线程 1 个通道”规则很重要,因为该语言会阻塞通道/消费者所在的线程。你会得到某种consume 调用,线程将阻塞,等待消息出现。

这就是为什么您需要在支持线程的语言中每个通道有 1 个线程。

不过,在 NodeJS 中,订阅者使用消息的调用是非阻塞的。

这意味着您可以放心地抛弃1 channel per thread 概念。

我自己的 NodeJS 和 RabbitMQ 代码通常会在我的应用程序的单个实例中打开数百个通道。

频道便宜且易于打开。设置消息生产者或消费者也很便宜。真正的成本是 1) 在连接中,以及 2) 在收到消息后执行实际工作。

这归结为扩展您的消费者。查看 NodeJS 和 RabbitMQ 时,您需要监控消息吞吐量以确定何时生成应用程序的新实例。如果您有一个持续增长的队列并且它永远不会耗尽(已处理所有消息),那么您需要生成一个新的消费者实例。


补充几点:

我强烈建议您使用 https://github.com/arobson/rabbot 来满足您的 NodeJS / RabbitMQ 需求。我已经为 RabbitMQ 使用了很多“简单”的 NodeJS 库,它们都有一些我认为无法接受的限制。 Rabbot 具有更好的抽象层,可以更轻松地使用 RabbitMQ,同时仍为您提供所需的所有灵活性。

您可能还想在这里查看我的 RabbitMQ 和 NodeJS 课程:https://sub.watchmecode.net/guides/microservices-with-rabbitmq/ - 截屏视频、电子书和对行业专家的采访,可帮助您快速掌握 RabbitMQ 和 NodeJS。但请注意:screecast 使用 Wascally 作为主库 - 这是 Rabbot 的前身(当他们对其内部进行了一些重大更改时,它被重命名为 Rabbot)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    相关资源
    最近更新 更多