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 的限制因素通常是:
- 需要随着消息数量和队列数量增长的内存(可以在仪表板中检查)(如果您不使用直接进入磁盘的惰性队列)。
- 文件描述符的最大数量(每个连接至少 1 个)在许多发行版中通常默认为太低的值(参考:https://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2012-April/019615.html)
- CPU 用于路由消息
我确实找到了问题。我实际上错误地配置了 RabbitMQ 服务,只是给了它 1024 个文件描述符限制。增加它解决了这个问题。
我开发了一个应用程序,我们需要处理通过 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 的限制因素通常是:
- 需要随着消息数量和队列数量增长的内存(可以在仪表板中检查)(如果您不使用直接进入磁盘的惰性队列)。
- 文件描述符的最大数量(每个连接至少 1 个)在许多发行版中通常默认为太低的值(参考:https://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2012-April/019615.html)
- CPU 用于路由消息
我确实找到了问题。我实际上错误地配置了 RabbitMQ 服务,只是给了它 1024 个文件描述符限制。增加它解决了这个问题。