Tow*_*man 2 amqp rabbitmq node.js
我正在使用NodeJS和amqplib来构建一个简单的作业排队库(有点类似于Jackrabbit),以便在一个服务中使用,该服务应解析包含许多不同事件信息的相当大的订阅源.
解析信息后,它将分发到数千个队列(队列是必须遵守消息顺序的最小单元),然后由我的排队库使用.
问题是:在这种情况下,我如何遵循"每个应用程序1个连接,每个线程1个通道,每个通道1个消费者"指南?这将导致产生数千个进程,浪费大量内存和资源.
注意:每个队列中的消息数量不是很高:最多约1-2 msg/sec
我假设您在运行代码时知道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).
| 归档时间: |
|
| 查看次数: |
1309 次 |
| 最近记录: |