3

在构建同时处理多个客户端的 Java 服务器时,我需要一些建议。客户端需要在相当长的时间内保持连接。我目前正在使用阻塞 IO 并产生一个线程来从连接到服务器的每个客户端读取,但这显然是不可扩展的。

我找到了一些选项,包括使用具有固定大小线程池的 Selector 或 Executor。我对任何一个都不太熟悉,那么这里最好的解决方案是哪一个?谢谢!

4

4 回答 4

1

这取决于您对可扩展性的定义。您所描述的每个连接只有一个线程的系统可以扩展到数百甚至数千个并发连接,它会在某个时候碰壁。

您的问题是说您的客户端连接并保持连接很长一段时间,可能有一个 IO 线程来处理读取和写入,但使用 Executor 将请求的处理分派到另一个线程。

已经编写了一些框架/服务器来处理这种事件驱动的设计。看一下:

值得注意的是,世界上充满了失败的初创公司和具有真正可扩展架构的软件产品。规模化是一个很好的问题,有问题总比没有问题和没有客户好。

于 2011-04-10T21:24:16.470 回答
0

使用多个线程是可扩展的。例如 Apache 就是这样做的,一些使用它的网站会吸引很多访问者。但是,另一种方法确实是使用选择器,尽管我没有使用它的经验。

毕竟,这似乎是一个问题,哪种宗教是最好的。

于 2011-04-10T21:19:52.910 回答
0

这种工作有很多框架,例子

  1. 网状
  2. 阿帕奇米娜
于 2011-04-10T21:30:40.383 回答
0

独立于可扩展性,每个服务器应用程序都有其局限性。通过使用阻塞 IO,您的限制之一将是 VM 可以生成的线程数,因为您采用的方法是“每个客户端一个线程”。对于 NIO(其中 Selector 是其中一个类),该方法是“每个请求一个线程”,这将在稍后用完线程。

您的应用程序的水平可扩展性 ( http://en.wikipedia.org/wiki/Scalability#Scale_horizo​​ntally_vs._vertically ) 将不依赖于这些选择中的任何一个。

于 2011-04-10T21:33:49.733 回答