确定Jetty将打开的最大WebSockets数。
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处理程序中,请求的顺序不受线程的影响,而是由连接本身决定。