并发请求到底意味着什么?

时间:2011-02-16 14:04:44

标签: networking network-programming

当我们谈论Web应用程序的容量时,我们经常提到它可以处理的并发请求。

正如我所讨论的another question,以太网使用TDM(时分复用),并且没有2个信号可以同时通过线路。因此,如果Web服务器通过以太网连接连接到外部世界,那么根本就没有并发请求。所有请求都会一个接一个地发出。

但如果网络服务器通过类似无线网卡的方式连接到外部世界,我相信多个信号可以通过电磁波同时到达。只有在这种情况下,才会有真正的并发请求。

我是对的吗?

感谢。

3 个答案:

答案 0 :(得分:7)

我认为Web应用程序的“并发请求”不会达到链接级别。这更像是应用程序处理请求以及在处理过程中有多少请求到达的问题。

例如,如果请求平均需要2秒才能完成(从在Web服务器上接收它到通过应用程序处理它以发回响应),那么它可能需要处理大量并发请求每秒许多请求。

请求需要重叠并同时处理,否则请求队列将无限期地填满。这似乎是常识,但对于许多Web应用程序而言,这是一个真正令人担忧的问题,因为大量请求可能会使应用程序的资源陷入困境,例如数据库。因此,如果应用程序具有较差的数据库交互(过于复杂的过程,较差的索引/优化,到许多其他应用程序共享的数据库的慢速链接等),则会产生瓶颈,限制应用程序可以处理的并发请求的数量即使应用程序本身应该能够处理它们。

答案 1 :(得分:3)

确实没有两个数据包可以在同一时间到达(除非根据Gabe的评论使用多个网卡)。但是,Web请求通常需要许多数据包。当多个请求几乎同时进入(无论是使用有线还是无线访问)时,这些包的到达就会散布在一起。此外,这些请求的处理可能会重叠。

在图片中添加多线程(或多个处理器/核心),您可以看到冗长的操作,例如从数据库中读取(需要大量等待响应),即使个人也很容易重叠数据包以串行方式到达。

编辑:添加了上述说明,以纳入Gabe的反馈意见。

答案 2 :(得分:0)

。想象一下在端口80监听的http服务器,会发生什么:

  • 客户端连接到服务器以请求某个页面;它使用某个原始本地端口从某个原始IP地址连接。

  • 操作系统(实际上是网络堆栈)查看传入请求的目标IP(因为服务器可能有多个NIC)和目标端口(80),并验证是否已注册某些应用程序来处理该数据端口(http服务器)。 4个数字(原始IP,原始端口,目标IP,端口80)的组合唯一地标识连接。如果此类连接尚不存在,则将新的连接添加到网络堆栈的内部表中,并将连接请求传递给http服务器的侦听套接字。从现在开始,网络堆栈只会将该连接的数据传递给应用程序。

  • 多个客户端可以发送请求,对于上面发生的每个请求。因此,从网络的角度来看,所有这些都是串行发生的,因为数据一次只能到达一个数据包。

  • 从软件的角度来看,http服务器正在侦听传入的请求。在客户端开始出错之前它可以排队的请求数由程序员根据硬件容量确定(这是并发的第一位:可能有多个请求等待处理)。对于每一个,它将创建一个新的套接字(尽可能快地继续清空请求队列)并让请求的实际处理由应用程序的另一部分(不同的线程)完成。这些处理程序(理想情况下)将花费大部分时间等待数据到达并快速(理想地)对其作出反应。

  • 由于数据处理通常比网络I / O快许多倍,因此即使硬件只包含一个处理器,服务器也可以在处理网络流量时处理许多请求。多个处理器可提高此功能。因此,从软件的角度来看,所有这些都是同时发生的。

  • 如何实现数据的实际处理是性能的关键所在(您希望它尽可能高效)。存在多种可能性(Socket类提供的异步套接字操作,线程池,唯一线程,.NET 4中的新并行功能)。