每个客户端一个线程。可做的?

2022-09-02 13:15:54

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

handshake();

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

cleanup();

(线程是从 中创建的,因此启动线程时不应有任何明显的开销)Executors.newCachedThreadPool()

我知道这是一个有点幼稚的设置,如果线程是专用的操作系统线程,它将无法很好地扩展到许多连接。但是,我听说Java中的多个线程可以共享一个硬件线程。这是真的吗?

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


答案 1

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

看看Java NIO或framworks,它们将帮助您更轻松地开始做复杂的事情(例如Apache Mina)


答案 2

这有可能扩展到数千个客户端。但下一个问题是千。

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

最终,您将进入一个问题,即在群集配置中设置服务器,平衡多台物理机上的负载是否有用。