RabbitMQ&NodeJS:继“每个应用1个连接,每个线程1个通道,每个通道1个用户”指南

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

信息parsing后,它被分配到数以千计的队列(队列是消息顺序必须遵守的最小单位),然后由我的排队库消耗。

问题是:在这种情况下,如何遵循'每个应用1个连接,每个线程1个通道,每个通道1个用户'的指导方针? 这会造成数以千计的进程产生,浪费大量的内存和资源。

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

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

在基于线程的语言中,“每个线程1个通道”规则非常重要,因为该语言将阻塞通道/客户所在的线程。 你会得到一些consume电话,线程会阻塞,等待消息出现。

这就是为什么你需要每个通道有一个线程,支持线程的语言。

但在NodeJS中,订阅者使用消息的呼叫是非阻塞的。

这意味着您可以安全地抛出1 channel per thread概念的1 channel per thread

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

渠道便宜,易于打开。 build立一个消息生产者或消费者也很便宜。 真正的成本是1)在连接,2)一旦你收到消息做实际的工作。

这是什么让你的消费者扩大。 在查看NodeJS和RabbitMQ时,需要监视消息吞吐量以确定何时产生应用程序的新实例。 如果你有一个持续增长的队列,并且它不会消耗(处理所有消息),那么你需要产生一个新的消费者实例。


一些额外的说明:

我强烈build议使用https://github.com/arobson/rabbot来满足您的NodeJS / RabbitMQ需求。 我已经为RabbitMQ使用了许多“简单的”NodeJS库,它们都有一些限制,我觉得是不可接受的。 Rabbot有一个更好的抽象层,使得RabbitMQ的工作更容易,同时仍然给你所有你需要的灵活性。

您可能也想看看我的RabbitMQ和NodeJS课程,在这里: https : //sub.watchmecode.net/guides/microservices-with-rabbitmq/ – 屏幕录像,电子书和行业专家采访,以帮助您加快与RabbitMQ和NodeJS很快。 不过要注意的是,预录片使用的是Wascally作为主要的图书馆 – 这是Rabbot的前身(当它对内部做了一些大的改动时,它被重新命名为Rabbot)。