【问题标题】:Channel pooling strategy for AMQP using NodeJS使用 NodeJS 的 AMQP 通道池策略
【发布时间】:2015-08-18 18:50:34
【问题描述】:

要从 NodeJS 发布者(我使用的是 bramqp,但问题是通用的)向 RabbitMQ(已确认、持久)发布消息,应该采用什么通道池策略?

如果我创建一个巨大的池(20,000 +)并在每次需要发布时寻找一个免费频道,然后在我得到确认时释放频道(保留在免费池中),然后在高负载时,确认延迟,因此创建了大量通道,导致 RabbitMQ 中的 erlang 进程迅速增加,从而降低其性能。

如果我使用非常小的池或没有池进行管理,那么一旦速率很高,就会抛出套接字错误,唯一的选择是重置完整的连接。

这里的最佳做法是什么?

【问题讨论】:

  • 我不确定 RabbitMQ 服务器在通道方面的表现如何 - 如果它为每个通道创建一个新的 Erlang 进程,这让我很担心。您能否分享有关您的操作方案的更多详细信息?

标签: node.js rabbitmq amqp node-amqp


【解决方案1】:

我不能说我了解您在做什么,但重要的是要了解通道是协议级别的构造。没有“通道池”之类的东西 - 当您开始与 AMQP 服务器交互时,它使用现有连接(如果可用)并通过在握手过程中为通道标头分配一个整数值来创建一个新的“通道” .也许您的程序实际上正在创建大量连接?

我的建议是每次需要发布时都执行以下操作:

  1. 打开一个频道
  2. 发布消息
  3. 等待确认
  4. 关闭频道

【讨论】:

  • @Vlad- 您提供的链接是相对较新的文档。我不确定它的意义何在,但从架构的角度来看,协议规范清楚地表明通道将被使用,然后被丢弃。如果 RMQ 没有以这种方式实现规范,那么这是实现中的严重缺陷。
  • 链接是新文档,但高渠道流失背后的想法适用。不建议为每条发布的消息打开和关闭通道。在大多数情况下,每个线程都应该有一个通道,或者这是我从文档中了解到的。
猜你喜欢
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 2021-07-22
  • 2018-06-20
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多