所有的web请求都是并行执行和异步处理的吗?
本文关键字:异步 处理 并行执行 web 请求 | 更新日期: 2023-09-27 18:04:50
我正在使用一个WebApi服务控制器,由IIS托管,我正在努力理解这个架构是如何工作的:
-
当一个网页客户端同时发送异步请求时,所有这些请求是否在WebApi控制器上并行执行?
-
在IIS应用程序池中,我注意到队列大小设置为1000默认值-这是否意味着1000个最大线程可以同时在WebApi服务器上并行工作?或者这个值只与这个IIS队列相关?
-
我读到IIS维护某种线程队列,这个队列是异步发送它的工作吗?或者IIS发送给WebApi服务的所有客户端请求都是同步发送的?
您正在查看的队列大小指定将为每个应用程序池(通常映射到一个w3wp工作进程)排队的最大请求数。一旦超过队列长度,将返回503个"Server Too Busy"错误。
在每个工作进程中,可以/将运行多个线程。每个请求在工作进程中的一个线程上运行(我相信每个进程默认最多250个线程)。
因此,从本质上讲,每个请求都在自己的线程上处理(并发-至少,线程获得并发),但特定应用程序池的所有线程(通常)由单个进程管理。这意味着,就请求本身而言,请求确实是异步执行的。回复你的评论;如果您启用了会话(您可能已经启用了),那么ASP。NET将请求排队,以便为每个请求维护对会话的锁。试着在Chrome中点击你的睡眠动作,然后在Firefox中点击你的快速响应动作,看看会发生什么。您应该看到两个不同的会话允许您的请求并发执行。
是的,所有请求都将在限制的情况下使用CLR线程池中的线程并行执行。关于针对应用程序池设置的队列大小,此限制是IIS开始拒绝具有503 -服务不可用状态码的请求。甚至在此发生之前,您的请求将被IIS/ASP.NET排队。这是因为线程不能随意创建。可以运行的并发请求数量是有限制的,它由MaxConcurrentRequestsPerCPU和其他一些参数设置。要实现真正意义上的并行执行1000个线程,需要1000个CPU内核。否则,将需要对线程进行时间切片,这将增加系统开销。因此,线程的数量是有限的。我想,通过一个简单的回答很难全面地回答你的问题。您可能需要阅读一些内容,最好从http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx.