我需要一些建议来同时处理多个客户端的Java服务器。客户需要在相当长的时间内保持连接。我目前正在使用阻塞IO并生成一个线程来从连接到服务器的每个客户端读取,但这显然是不可扩展的。
我找到了一些选项,包括使用Selector或Executor和固定大小的线程池。我对这两者都不太熟悉,所以这是最好的解决方案吗?谢谢!
答案 0 :(得分:1)
这取决于您对可扩展性的定义。您描述的每个连接使用单个线程的系统可扩展到数百个,甚至可能是几千个并发连接,它会在某个时刻出现问题。
您的问题是您的客户端连接并保持连接很长一段时间,可能有一个IO线程来处理读取和写入,但是请求的处理使用一个调度到另一个线程执行程序。
已经编写了用于处理此类事件驱动设计的框架/服务器。看看:
值得注意的是,这个世界充满了失败的创业公司。具有真正可扩展架构的软件产品。扩展是一个很好的问题,更好地解决问题而不是没有客户。
答案 1 :(得分:0)
使用多个线程是可扩展的。例如Apache就是这样做的,一些使用它的网站会吸引很多访问者。但是,另一种方法确实会使用选择器,尽管我没有使用它的经验。
毕竟,这似乎是一个问题,哪种宗教是最好的。
答案 2 :(得分:0)
这种工作有很多框架,例子
答案 3 :(得分:0)
独立于可扩展性,每个服务器应用程序都有其限制。通过使用阻塞IO,您的一个限制将是VM可以生成的线程数,因为您采用的方法是“每个客户端一个线程”。使用NIO(其中Selector是其中一个类),该方法是“每个请求一个线程”,后者将耗尽线程。
您应用的横向可扩展性(http://en.wikipedia.org/wiki/Scalability#Scale_horizontally_vs._vertically)不会取决于其中任何一种选择。