我假设您知道 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)。