我正在设计一个应用程序,其中许多客户端连接到中央服务器。该服务器保持这些连接,每隔半小时发送一次保持活动。服务器有一个嵌入式HTTP服务器,它为客户端连接提供接口(例如http://server/isClientConnected?id=id)。我想知道最好的方法是什么。我目前的实现是用Java编写的,我只有一个带有ID的Map作为键,但是为每个连接启动了一个线程,我不知道这是否真的是最好的方法。任何指针都将不胜感激
谢谢,
艾萨克沃勒
答案 0 :(得分:6)
使用java.nio包,如本页所述:Building Highly Scalable Servers with Java NIO。另请仔细阅读本页:Architecture of a Highly Scalable NIO-Based Server。
就我个人而言,我不打扰NIO内部并使用像Apache MINA或xSocket这样的框架。 NIO很复杂,很容易以非常模糊的方式出错。如果您希望它“正常工作”,那么使用框架。
答案 1 :(得分:3)
每个连接使用一个线程,通常可以在一台计算机上扩展到大约10,000个连接。对于Windows 32计算机,您可能会达到大约1,000个连接的限制。
要避免这种情况,您可以更改程序的设计,也可以向外扩展(水平)。您必须通过硬件成本来降低开发成本。
每个用户的单个线程,通过单个连续连接通常是最简单的编程模型。我会坚持使用这个模型,直到达到当前硬件的极限。那时,我会决定更改代码,或添加更多硬件。
答案 2 :(得分:2)
如果客户端将长时间连接,则为每个客户端分配一个线程可能会有问题。服务器上的每个线程都需要一定量的资源(例如,堆栈的内存)。
您可以使用Jetty Continuations通过使用异步servlet来处理客户端请求,并减少线程数。
答案 3 :(得分:0)
详细了解Reactor模式。在Java中有一个实现(它使用通道代替客户端的线程)。 它易于实施且非常有效。