一次可以处理多少个请求
Posted
技术标签:
【中文标题】一次可以处理多少个请求【英文标题】:How many requests can handle a port at 'a' time 【发布时间】:2012-03-18 20:55:42 【问题描述】:我正在创建一个具有登录页面的 Web 应用程序,其中有多个用户可以尝试同时登录。所以在这里我需要一次处理多个请求。
我知道这已经在许多流行的网站上实现了,比如G talk
。
所以我有一些问题。
“一个端口?”
我(服务器)可以创建多少个套接字?有什么限制吗?
例如正如我们所知,当我们使用 Socket 编程(TCP)实现客户端服务器通信时,我们将一个端口号(未保留的端口号)传递给服务器以创建套接字。
所以我的意思是说,如果一次有 100000 个请求,那么端口对这些所有请求的处理方式是什么。
他是否为所有这些请求维护了一些队列,或者他只是根据他的限制接受请求数量?如果是,什么是处理端口的请求限制大小?
总结: 我想知道服务器如何同时处理多个请求?我对此一无所知。我知道我们正在通过它的 IP 地址和端口号连接到服务器。 所以我认为只有一个端口,许多请求只能通过不同的客户端到达该端口,那么服务器如何管理所有请求?
这就是我想知道的。如果你详细解释这个概念,那将非常有帮助。不管怎么说,还是要谢谢你。
【问题讨论】:
这取决于您为请求提供服务的线程数? 请检查这个链接它已经在这里回答了***.com/questions/1575453/… 抱歉,在所有这些可观的答复之后,我的问题仍然存在,即一个端口? 【参考方案1】:如果您使用 Netty 之类的东西,在 Java 中应该可以轻松实现 100,000 个并发连接。
您需要能够:
以足够快的速度接受传入连接。 NIO framework 在这里有很大帮助,这是 Netty 内部使用的。传入请求的队列较小,因此您需要能够比队列填满更快地处理这些请求。 为每个客户端创建连接(这意味着连接信息、缓冲区等需要一些内存开销) - 您可能需要调整 VM 设置,以便为所有连接提供足够的可用内存查看article from 2009,他们讨论了如何在四核服务器上以大约 20% 的 CPU 使用率实现 100,000 个并发连接。
【讨论】:
@mikera.-可能是 NIO 会在套接字侦听请求时处理请求。但是如果套接字非常忙于接受其他同时连接,那么 NIO 将如何有用?【参考方案2】:那么您可能会受到您的操作系统支持的文件描述符数量(在 *nix 的情况下)或您的网络服务器支持的同时连接数的限制。我机器上的操作系统最大值似乎是 75000。
【讨论】:
【参考方案3】:端口不处理请求,它接收数据包。根据服务器的实现,这个数据包可能由一个或多个进程/线程处理,所以理论上这是无限的。但是您总是会受到带宽和处理性能的限制。
如果大量数据包到达一个端口并且无法及时处理,它们将被缓冲(由服务器、操作系统或硬件)。如果这些缓冲区已满,则拥塞可能由网络组件(路由器、交换机)和网络流量所基于的协议处理。例如 TCP 有一些方法可以避免或控制拥塞:http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Congestion_control
【讨论】:
那么要消除这种拥塞情况,我应该如何在代码和硬件级别修改我的应用程序? 您的代码应该尽可能多地并行处理请求。如果一个请求需要 1 秒来处理,那么您需要 100,000 个线程来每秒处理 100,000 个请求。【参考方案4】:这通常在您使用的应用程序/Web 服务器中进行配置。如何限制并发请求的数量是通过限制允许服务器生成以服务请求的并行工作线程的数量。如果进入的请求多于处理它们的可用线程,它们将开始排队。这是您通常配置的第二件事,即套接字积压日志大小。当 back-log 满时,当有新的请求进来时,服务器将开始响应“连接被拒绝”。
【讨论】:
是的,这就是我的问题。我不希望发生这种“连接被拒绝”的情况。为此,我如何在硬件和代码级别修改我的应用程序? 1. 我应该使用多个端口来接受数百万个连接 2. 我应该修改 JVM 内存还是某种内存级别的东西 3. 我应该使用执行器、选择器还是 NIO? 4 我应该用什么硬件来处理这种巨大的应用需求?以上是关于一次可以处理多少个请求的主要内容,如果未能解决你的问题,请参考以下文章