每个客户一个线程.可行?

Bar*_*lom 19 java io networking multithreading nio

我正在编写一个Java服务器,它使用普通套接字来接受来自客户端的连接.我正在使用相当简单的模型,其中每个连接在阻塞模式下都有自己的线程读取.伪代码:

handshake();

while(!closed) {
  length = readHeader(); // this usually blocks a few seconds
  readMessage(length);
}

cleanup();
Run Code Online (Sandbox Code Playgroud)

(线程是从一个创建的,Executors.newCachedThreadPool()所以启动它们不应该有任何重大的开销)

我知道这是一个天真的设置,如果线程是专用的OS线程,它不会很好地扩展到许多连接.但是,我听说Java中的多个线程可以共享一个硬件线程.真的吗?

知道我将在Linux上使用Hotspot VM,在具有8核和12GB RAM的服务器上,您认为这种设置适用于数千个连接吗?如果没有,有哪些替代方案?

Mar*_*ers 5

这可能会扩展到数千个客户端.但是,有多少十万是下一个问题.

一个常见的替代方法是使用选择器和非阻塞I/O中找到的java.nio包.

最后,您会遇到在群集配置中设置服务器是否有用的问题,以平衡多个物理机器上的负载.


ivy*_*ivy 5

这可以很好地扩展到数百个连接,而不是数千个连接.一个问题是Java线程也需要相当多的堆栈(例如256K),并且操作系统在调度所有线程时会遇到问题.

查看Java NIO或framworks,它将帮助您更轻松地开始复杂的工作(例如Apache Mina)