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)。
- 使用amqplib控制Node.JS,控制RabbitMQ使用者的使用率
- 要么“当-js”或基本的amqplib rabbitmq nodejs教程不工作
- 如何连接节点的amqplib与SSL连接?
- 当node-amqp没有exception
- node-amqp不能发送消息给RabbitMQ
- 我无法获取AMQP发布和订阅,从IBM MQ v9.0.1.0开始使用Node JS v6和mqlight v2.0运行
- 如何构build一个消息总线与Node.js和API分布在几个听众?
- Node.js中的ECONNRESET Azure中的RabbitMQ使用者
- RabbitMQ用于具有Express路由的NodeJS