RabbitMQ 作为 Spring Websocket 使用的 Message Broker 在负载下死机

RabbitMQ as Message Broker used by Spring Websocket dies under load

我开发了一个应用程序,我们需要处理通过 websocket 连接连接到后端的 160k 并发用户。

我们决定使用 spring websocket 实现和 RabbitMQ 作为消息代理。

在我们的应用程序中,每个用户都需要订阅其用户队列 /exchange/amq.direct/update 以及另一个队列,其他用户也可以订阅另一个队列 /topic/someUniqueName

在我们的第一个性能测试中,我们采用了朴素的方法,即每个用户订阅两个新队列。

当 运行 测试 RabbitMQ 在同时连接大约 800 个用户时静默终止,因此大约有 1600 个队列处于活动状态 (See the graph of all RabbitMQ objects here)。

我看过 you should be careful opening many connections to RabbitMQ

现在我想知道 approach that is anticipated by Spring Websocket with opening one queue per user 是否是高负载系统的概念性问题,或者我的系统是否存在其他错误。

RabbitMQ 的限制因素通常是:

我确实找到了问题。我实际上错误地配置了 RabbitMQ 服务,只是给了它 1024 个文件描述符限制。增加它解决了这个问题。