一个端口同时可以处理多少个请求?

5
我正在创建一个具有登录页面的Web应用程序,多个用户可以同时尝试登录。因此,我需要处理同时发生的请求。
我知道像Gtalk这样的流行网站已经实现了这一点。
所以我有一些问题。
“一个端口能同时处理多少个请求?”
我(服务器)可以创建多少个套接字?是否有任何限制?
例如。当我们使用Socket编程(TCP)实现客户端服务器通信时,我们向服务器传递“端口号(未保留的端口号)”以创建套接字。
那么我的意思是,如果在同一时间收到100000个请求,那么端口对所有这些请求的处理方法是什么。
它是否维护所有这些请求的队列,或者只接受其限制范围内的请求数量?如果是,则端口的处理请求限制大小是多少?
总结: 我想知道服务器如何同时处理多个请求?我对此一无所知。我知道我们通过IP地址和端口号连接到服务器,就是这样。 所以我认为只有一个端口,许多请求只通过不同的客户端发送到该端口,因此服务器如何管理所有请求?
这就是我想知道的。如果您详细解释这个概念,将非常有帮助。无论如何感谢您。

这取决于您用于处理请求的线程数量? - Kimvais
请检查此链接,已经在这里回答了https://dev59.com/_HI_5IYBdhLWcg3wAd42 - Renjith K N
抱歉,尽管有这么多值得赞赏的回复,但我的问题仍然存在,那就是一个端口能同时处理多少个请求? - Java
4个回答

6
一个端口不会处理请求,而是接收数据包。根据服务器的实现方式,这些数据包可以被一个或多个进程/线程处理,因此从理论上讲这是无限制的。但是,您总是受到带宽和处理性能的限制。
如果大量数据包到达一个端口并且不能及时处理,它们将被缓冲(由服务器、操作系统或硬件完成)。如果这些缓冲区已满,拥塞可能由网络组件(路由器、交换机)和网络流量所基于的协议来处理。例如,TCP 有一些方法来避免或控制拥塞:http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Congestion_control

那么,为了消除拥塞的情况,我应该如何在代码和硬件层面上修改我的应用程序呢? - Java
你的代码应该尽可能并行处理尽可能多的请求。如果一个请求需要1秒钟来处理,那么你需要100,000个线程来处理每秒100,000个请求。 - Koraktor

1

这通常在您使用的应用程序/ Web 服务器中进行配置。您限制并发请求的方式是通过限制允许服务器生成以服务请求的并行工作线程的数量来实现的。如果进来的请求比可用的线程数多,它们将开始排队。这是您通常配置的第二件事,套接字后备日志大小。当后备日志已满时,服务器将开始响应新请求时出现“连接被拒绝”。


是的,这就是我的问题。我不希望出现“连接被拒绝”的情况。为此,我应该如何在硬件和代码层面上修改我的应用程序?1. 我是否应该使用多个端口接受数百万个连接;2. 我是否应该修改JVM内存或其他类似的内存级别的东西;3. 我是否应该使用执行器、选择器或NIO? 4. 我的硬件应该怎样来处理这种巨大的应用程序需求? - Java

1

如果你使用类似于Netty的东西,那么在Java中轻松实现100,000个并发连接是很容易的。

你需要做到以下几点:

  • 足够快速地接受传入的连接。NIO框架在这方面非常有帮助,这也是Netty内部使用的。对于传入请求,有一个较小的队列,因此您需要能够比队列填满更快地处理它们。
  • 为每个客户端创建连接(这意味着需要一些内存开销,例如连接信息、缓冲区等)-您可能需要调整VM设置以获得足够的空闲内存来处理所有连接。

请参阅2009年的文章,其中讨论了在四核服务器上使用约20%的CPU使用率实现100,000个并发连接的方法。


@mikera.-也许当套接字监听请求时,NIO会处理它。但是如果套接字正在忙于接受其他同时连接的请求,那么NIO如何有用呢? - Java

1

如果你使用*nix系统,那么你可能会受到文件描述符数量的限制,或者是受到Web服务器支持的同时连接数的限制。在我的机器上,操作系统的最大值似乎是75000。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接