【发布时间】:2021-04-22 09:27:15
【问题描述】:
谁能解释 IIS 中应用程序池、工作进程和应用程序域之间的区别?另外,它们是如何协同工作的?我已经阅读了几篇文章,但仍然有些混乱。
- 在 IIS 中创建的每个网站都会成为应用程序吗?
- 每个应用程序是否与一个工作进程相关联?
- 应用程序域在哪里出现?
【问题讨论】:
谁能解释 IIS 中应用程序池、工作进程和应用程序域之间的区别?另外,它们是如何协同工作的?我已经阅读了几篇文章,但仍然有些混乱。
【问题讨论】:
是的,但并非每个应用程序都是网站。您可以拥有一个嵌套在网站下的应用程序。
是的,每个应用程序都必须有一个工作进程(应用程序池),尽管一个应用程序池可以服务多个应用程序。单个 Web 应用程序可以分布式(网络花园/农场),这意味着它将在多个进程中运行。
每个进程都将在自己的应用程序域中运行(每个应用程序池都是一个单独的应用程序域)。
来自 MSDN。
应用程序是网站根级别的一组内容或网站根目录下单独文件夹中的一组内容。
应用程序池定义一组一个或多个工作进程,并配置有向分配给该应用程序池的一个或多个应用程序提供请求的通用设置。因为应用程序池允许一组 Web 应用程序共享一个或多个类似配置的工作进程,所以它们提供了一种方便的方法来将一组 Web 应用程序与服务器计算机上的其他 Web 应用程序隔离开来。进程边界将每个工作进程分开;因此,一个应用程序池中的应用程序问题不会影响其他应用程序池中的网站或应用程序。应用程序池显着提高了 Web 基础架构的可靠性和可管理性。
【讨论】:
来自源链接:-http://weblogs.asp.net/owscott/archive/2007/09/02/application-vs-appdomain.aspx
应用程序是一个 IIS 术语,但它是 ASP.NET 使用的。 本质上,它创建了一个沙箱,或一组边界来分隔 与其他网站不同的网站或网站的一部分。
AppDomain 是一个 .NET 术语。 (在 IIS7 中,AppDomains 的作用更大 在 IIS 中,但大多数情况下它是一个 ASP.NET 术语)
worker进程用于处理web应用的请求。
【讨论】:
我试着用其他词来表达。
在一个服务器中,您可以拥有许多一起运行的 asp.net 站点。每个站点都是一个应用域。
您必须为每个人分配一个应用程序池。许多应用程序域(站点)可以具有相同的应用程序池,并且因为它们具有相同的应用程序池,所以它们在相同的进程和相同的帐户下运行 - 并且它们具有相同的池设置。如果此池重新启动,则该池下的所有站点都会重新启动。
现在每个池可以有一个或多个工作进程。每个工作进程都是运行您的站点的不同程序,有它们单独的静态变量,它们不同的启动停止调用等。不同的工作进程不会一起通信,交换数据的唯一方法是来自公共文件或公共数据库。如果您有多个工作进程并且其中一个进行长时间计算,那么另一个可以处理互联网呼叫并显示内容。
当您将多个工作进程分配给单个池时,您就创建了所谓的网络花园,如果一台计算机是一台处理机器,您的网站就像在多台计算机上运行。 p>
每个工作进程可以有很多线程。
更多工作进程如何影响您:
当您有一个工作进程时,一切都会变得更简单,在您的应用程序中,所有静态变量都是相同的,您可以使用lock 来同步它们。
当您分配多个工作进程时,您仍然继续将lock 用于静态变量,静态变量在您的站点的许多运行中没有什么不同,并且如果您有一些公共资源(例如在磁盘上创建缩略图)然后你需要将你的工作进程与Mutex同步。
还有一个注意事项。听起来,当您制作更多工作进程时,您可能会获得更流畅的异步页面加载。 asp.net 的会话处理程序存在一个小问题,即锁定页面加载的整个过程——这取决于你是否知道并处理它——或者改变它。
所以让我们只讨论一个具有许多工作进程的站点。在这里,您面临需要将公共资源更改与Mutex 同步的问题。但是使用会话的页面/处理程序不是异步的,因为会话锁定了它们。这是一个很好的开始,因为您避免自己进行许多点的同步。
关于这个话题的一些问题:
Web app blocked while processing another web app on sharing same session
jQuery Ajax calls to web service seem to be synchronous
ASP.NET Server does not process pages asynchronously
Replacing ASP.Net's session entirely
现在这个会话锁定不会影响不同的站点。
在不同的站点中,更多的工作进程可以帮助一个站点不阻塞另一个运行时间较长的进程。
同样在不同站点之间,更多的池也可以提供帮助,因为每个池至少有一个工作进程,但请记住并使用进程资源管理器自己查看,每个工作进程占用您计算机的更多内存,以及一台具有 16G 内存的大型服务器并且一台 SQL 服务器不能有太多不同的工作进程 - 例如在具有 100 个共享站点的服务器上,您不能有 100 个不同的池。
【讨论】:
对 ASP.NET 开发人员的意义:为了使您的网站具有可扩展性,不要使用进程内会话,也不要使用静态类变量锁进行同步。
【讨论】: