【问题标题】:rabbitmq handling lots of consumers, connections vs channelsrabbitmq 处理大量消费者、连接与通道
【发布时间】:2017-03-13 20:37:33
【问题描述】:

我希望每个消费者都在他们自己的私有队列上收听。为此,我使用 Elixir 为每个用户生成一个进程,并订阅该进程以侦听他们私人用户队列上的新消息。

在我的 16G RAM 的 macbook pro 上,我的 rabbitmq 管理面板显示我有:

文件描述符:256 个可用 套接字描述符:138 个可用

显然我不能打开超过 138 个连接。

问题 1:这个限制是基于什么的,我可以提高它吗?我想知道在生产机器上可能会有多高(需要什么样的 EC2 实例),以及每个用户建立一个连接是否是个好主意。我读过该限制可能与 ulimit 有关,但是当我在命令行上运行 ulimit 时,我看到“无限制”。

我现在需要为 4000 个用户提供服务,并且每年可能会增长 500-1000 个用户。

另一种方法是从 Elixir 应用程序到 Rabbitmq 建立 1 个 tcp 连接,并为每个进程使用通道。这行得通,但它需要稍微复杂的设置。他们需要重用现有连接并在其上打开一个新通道,而不是每个进程都初始化自己的连接。

如果连接死了,我需要想出一个策略来重启一个普通的连接,然后级联重启每个进程的通道。我还没想好怎么做。

Q2:渠道是更好的主意吗?将所有通道放在一个连接中似乎是另一种极端。如果消息都在同一个连接上多路复用,是否会影响消息的带宽?

还有哪些可用的策略?

【问题讨论】:

  • 查看这篇文章:stackoverflow.com/questions/18418936/… 通常,您只需要一个应用程序连接,并且每个线程可能只需要一个通道。鉴于 Elixir 处理并发的方式不同,我无法真正回答您应该如何处理配置通道数。其他人可能在该领域有更多经验!
  • 我建议查看 Spring AMQP 代码如何使用连接池和通道池。在您的环境中,从一个连接和基准测试开始,然后尝试一组它们,在它们之间传播通道,并对其进行基准测试。

标签: erlang rabbitmq elixir


【解决方案1】:

频道是更好的主意吗?

是的。

每个应用程序实例应该只有一个打开的连接,并在其中广泛使用通道。

TCP/IP 连接的打开和维护速度慢且成本高。

频道速度快得离谱,而且在需要时打开、工作和关闭都很便宜。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    相关资源
    最近更新 更多