ActiveMQ + Spring STOMP 是否适合扩展 websockets,还是我们应该寻找其他东西? 我们面临的问题问题目前的调查

问题描述

我们有一个 Spring Boot 后端,它也维护与客户端(浏览器选项卡)的双向(STOMP over)websocket 连接。我们已经使用 STOMP broker Relay(服务器端)+ ActiveMQ(消息代理)实现了这一点。还有每 25 秒交换一次心跳消息以保持连接有效。

我们面临的问题

直到大约 1000 个连接,此设置似乎工作正常。 一旦它超过了 ActiveMQ 中的几千个连接,我们就会遇到一些奇怪的问题: 浏览器能够通过 Spring Boot 成功连接和订阅 ActiveMQ 上的主题,但是它没有成功接收消息,同时能够每 25 秒交换一次心跳! 我们的 Spring Backend 提高了 cpu 利用率,其中一个线程 tcp-client-loop 消耗了 1 个完整的 cpu

我们还在下面分享了我们的完整调查。

问题

这个架构是否有一些可调参数,是明天扩展到约 10 万个并发 websocket 连接的好解决方案吗?如果没有,有哪些行业推荐的向浏览器发送通知的替代方案?我们也一直在寻找 socket.io + redis pub/sub 以获取互联网上的大量参考资料,但不确定这是否真的是更好的方法

目前的调查

  1. 我们的后端日志显示事件正在发布并中继到客户端,但是这些事件的负载为空,并且包含 stompMessageType 作为 OTHER 而不是假定的值 MESSAGE。我们还在终端上使用了stomp客户端直接连接ActiveMQ,发现在此期间没有来自订阅主题的消息,所以这将我们的注意力转移到了ActiveMQ代理端的问题上。
  2. 在同样的高流量时间段内,我们注意到我们的后端卡在 tcp-client-loop 线程中,但无法确定这是否与与 ActiveMQ 服务器的连接有关。 附注- 由于连接成功建立,我们决定排除高流量期间的 tcp 连接限制。我们还将 ActiveMQ 配置为通过 STOMP 接受 50k 连接,而不是认的 1k。
  3. 即使在 DEBUGTRACE 日志级别,我们也几乎无法从 ActiveMQ 的日志(和 Web 控制台)中找出有关发布或使用错误的信息。在此期间,cpu 利用率仅徘徊在 5% 左右。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)