我正在使用NodeJS和amqplib来构建一个简单的作业排队库(有点类似于Jackrabbit),以便在一个服务中使用,该服务应该解析包含大量信息的大量提要不同的事件。
解析信息后,它会分发到数千个队列(队列是必须遵守消息顺序的最小单元),然后由我的排队库使用。
问题是:我如何遵循每个应用的 1连接,每个线程1个频道,每个频道1个消费者'在这种情况下的指导方针?这将导致产生数千个进程,浪费大量内存和资源。
注意:每个队列中的消息数量不是很高:最多约1-2 msg /秒
答案 0 :(得分:6)
我假设您在运行代码时知道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。但是请注意:screecasts使用Wascally作为主库 - 这是Rabbot的前身(当它们对Rabbot进行了一些重大更改时,它被重命名为Rabbot)。