我使用rabbitmq作为消息代理,在一个spring项目中使用websockets和STOMP。我正在查看可以有多少个并发 Websocket 连接(即有多少个并发移动和 Web 用户),我注意到有 3 个不同的地方会影响它:
1) apache tomcat 9 配置中的 maxConnections。
2)由 ulimit -n 检查的文件描述符的数量
3)服务器允许的端口数(我看到每个新用户打开与我的服务器的websocket连接,rabbitmq显示该连接正在使用新端口)。
所以我有点失落:
(a) 每个 websocket 实际上都需要一个专用端口吗?是否没有通道的概念来利用可用端口上的连接?
(b) 通道数与文件描述符数有关吗?我应该输入什么值(我的意思是一个 8 核和 16 GB RAM 的服务器节点可以处理一百万个文件描述符,这意味着一百万个并发 Websocket 客户端)?
(c) 最重要的是,如果消息代理为每个客户端使用唯一端口,那么前两个配置(maxConnections 和文件描述符数量)并不重要,因为我的 TCP 端口限制为大约 60K在操作系统上修改后?
(d) 总之,我的游戏中可以拥有的最大并发玩家的主要因素是什么(我在移动和网络应用程序上有它)。
任何人都可以向我解释完整的周期,包括所有前面提到的组件(Web 服务器、Web 服务器的操作系统、消息代理服务器的操作系统和消息代理本身)吗?为什么像 cloudamqp 这样的服务说它们在单个节点上支持多达 160K 并发连接,而我却看到每个客户端(应用程序用户)都保留了一个端口?
非常感谢您提前解释流程。
(a) 每个 websocket 实际上都需要一个专用端口吗?不在那里吗 利用可用端口上的连接的通道概念?
STOMP 没有通道的概念(https://stomp.github.io/stomp-specification-1.2.html)。每个 STOMP 客户端至少有一个与其关联的 TCP 连接。
(b) 通道数与文件描述符数有关吗? 我应该输入什么值(我的意思是一个 8 个服务器节点可以 内核和 16 GB RAM 处理一百万个文件描述符,这意味着一百万 并发 websocket 客户端)?
通道是 AMQP 特定的资源,与文件描述符无关。 AMQP / STOMP TCP 连接是关联的,每个连接消耗一个文件描述符。要使用的数量取决于您运行的基准测试,以了解您的服务器可以处理什么。
(c) 最重要的是,如果消息代理使用唯一的端口 每个客户端,然后是前两个配置(maxConnections 和文件数量 描述符)并不重要,因为我仅限于大约 60K 端口 在操作系统上修改 TCP 后?
每个TCP连接由源IP、源端口、目的IP和目的端口四元组标识。因此,您不受 60K 端口的限制。如果您的连接全部来自同一 IP 地址(例如负载均衡器或代理),那么您可能会遇到此问题,因为仅使用一个源 IP。
(d) 综上所述,最大并发玩家 I 的主要因素是什么 可以在我的游戏中
只有您可以通过运行模拟真实世界预期负载的基准来回答这个问题。也许您的服务器磁盘速度较慢,这可能是“主要因素”。或者它可能托管在不可靠的网络上。我建议使用像
toxiproxy
这样的工具测试您的代码,以模拟可能出现的问题。