确定Jetty将打开的最大WebSockets数。

9 浏览
0 Comments

确定Jetty将打开的最大WebSockets数。

我正在尝试弄清楚如何获取Jetty允许打开的最大数量的Websockets。从我的笔记本电脑上的Chrome浏览器来看,它似乎在254个时达到峰值。我正在努力确定这是Chrome的限制还是Jetty的限制或其他原因。

0
0 Comments

Jetty服务器的最大WebSocket连接数取决于线程池的配置。默认情况下,服务器使用最大200个线程的QueuedThreadPool启动。需要注意的是,线程池中的线程数与WebSocket的数量之间没有一对一的关系。如果存在空闲WebSocket,线程将被返回到池中供其他活动WebSocket使用。

如果您的WebSocket连接活动较低,使用Jetty的本机WebSocket实现而不是javax.websocket实现,并且不使用基于对象/流/流处理的消息处理方式,而是使用普通的String / ByteBuffer消息处理方式,立即返回onMessage分发,不要启动自己的线程等等,您可以轻松地从最大200个线程的线程池配置中提供40,000个活动WebSocket连接。

要了解有关线程池上线程数量的更多信息,请参见https://stackoverflow.com/a/44048711/775715。

线程池是在Server构造函数中创建并传递的,示例如下:

ThreadPool threadPool = new QueuedThreadPool(400);
Server server = new Server(threadPool);
ServerConnector http = new ServerConnector(server);
http.setPort(8080);
server.addConnector(http);

有人问是否有办法验证和检查连接数量与服务器的线程池配置无关,以及如何确保请求的顺序在连接器和处理程序之间保持一致。Jetty的开发者解释道,一旦HTTP请求升级到WebSocket,它不再受处理程序的HTTP行为约束。在Jetty中,所有线程和NIO处理都是基于活动连接数(即具有流量的连接)进行的,而不是连接数本身。

问题的根源在于,服务器将保持一个永久打开的TCP/IP连接,并将协议切换到WebSocket。这就像拥有一个正常的套接字连接一样,而不是在HTTP之上模拟(逻辑)套接字连接。因此,在WebSocket处理程序中,请求的顺序不受线程的影响,而是由连接本身决定。

0