2013-07-28 100 views
2

当只有一个进程可以听,并接受指定的IP地址和端口组合,然后怎么做Web服务器,以便扩展到聆听数百万传入的请求? 这个问题涉及到找出扩展套接字编程的大纲,因此我没有考虑使用硬件扩展解决方案进行负载平衡,也没有寻找网络套接字实现,而是寻找基本的低级套接字编程。Web服务器套接字编程

如果我必须写一个Web服务器监听传入的HTTP请求,应该是什么的线程监听传入的请求,以便设计大纲为它扩展到数百万传入的请求呢?

回答

1

如果你想要百万的并发连接,那么你将无法实现这一点。限制通常是数千。如果,另一方面,你要数以百万计的请求每秒服务,那么您可能就能够摆脱它,但只有当你的请求处理是最微不足道的那种,响应很短。

通常,如果您使用Java进行此操作,则不应使用标准阻止java.io API,因为每个单一连接都会使用两个线程:一个用于读取,一个用于写入。取而代之的是使用允许异步TCP通信的Netty库,这意味着只有中等大小的线程池可以处理大量的请求:线程永远不会处于空闲状态,等待输入被接收或输出被发送。他们只忙于处理的数据。

+0

'java.net'库不会'每个连接使用两个线程'。这将是一个应用程序设计选择。通过在适当的情况下滥用'available()',可能为所有连接使用单个线程,尽管可笑。在适当的硬件上,接受的连接数量可能会达到数十万。 – EJP

+0

这不仅仅是应用程序的选择,它将是阻塞API的常规方式。顺便说一句,我没有说(或者是说)它是每个连接占用2个线程的'java.net'库, –

+0

我说它是它的*用法*。我也很确定这种区分不需要澄清 –

1

你混为一谈“听”和“读出”。他们不是一回事。 '听'意味着服务器创建一个可以从中大量接受连接的监听套接字。每一个连接都会被读取和写入。

2

我为自己写了一个小的聊天服务器(这基本上做同样样的东西)。

我去的设计是接受连接的第一个线程(基本上是while循环,在ServerSocket对象实例上遍历accept())。该线程是listening to连接。

并且对于由accept()返回的每个连接,我开始了一个分离的线程,它处理和reads from该连接。所有这些线程引用都存储在同步的List中以供进一步处理,例如稍后关闭连接,等等。