我尝试创建约5千个并发客户端(从服务器到客户端的非停止数据发送)连接到我的glassfish websocket服务器。(CPU:双核,8GB RAM)
在连接了大约2500个客户端后,连接时间约为67秒,并且由于“TimeOutException”,我无法连接更多客户端。
一些事实:
- 线程池最大大小设置为12,000。 - 在第一个TimeoutException时,我有2500个客户端和约2450个线程。因此,我们在这里讨论每个连接一个线程。 - 这不是内存问题!
然后,我编写了两个简单的Websocket代理服务器,在Node.js和golang中处理Websocket连接。代理服务器与glassfish服务器之间的数据交换通过简单的Websocket连接进行。
现在,我能够创建超过5千个并发客户端而没有任何问题。 Wildfly 8和Tomcat 8也遇到了同样的问题。以下是评估: 现在我的问题是,Tyrus 是在glassfish中实现Websocket协议的,并在底层使用
在连接了大约2500个客户端后,连接时间约为67秒,并且由于“TimeOutException”,我无法连接更多客户端。
一些事实:
- 线程池最大大小设置为12,000。 - 在第一个TimeoutException时,我有2500个客户端和约2450个线程。因此,我们在这里讨论每个连接一个线程。 - 这不是内存问题!
然后,我编写了两个简单的Websocket代理服务器,在Node.js和golang中处理Websocket连接。代理服务器与glassfish服务器之间的数据交换通过简单的Websocket连接进行。
现在,我能够创建超过5千个并发客户端而没有任何问题。 Wildfly 8和Tomcat 8也遇到了同样的问题。以下是评估: 现在我的问题是,Tyrus 是在glassfish中实现Websocket协议的,并在底层使用
java.nio
库进行非阻塞I/O。那么为什么它的可扩展性如此之差呢?或者说为什么可扩展性如此不同。我的意思是我看不到java.nio
的任何优势。附注:只是调度开销吗?
编辑:如何重现问题
创建和连接客户端以及Websocket服务器的客户端软件位于不同的计算机上。
java.nio
的任何优势。 - dieter