【发布时间】: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 代码如何使用连接池和通道池。在您的环境中,从一个连接和基准测试开始,然后尝试一组它们,在它们之间传播通道,并对其进行基准测试。