3

我们有一个在 IIS Web-Garden 中运行的 ASP.Net Web 应用程序——它被配置为最多分配四个进程。在我们的 Web 应用程序中,第一个访问该站点的用户会导致所有缓存项目的加载。由于我们在 IIS Web-Garden 中运行,因此最终需要多达四个首次用户来为四个 Web-Garden 进程中的每一个建立缓存。此缓存构建需要 30-40 秒,我们已尝试使其更快,但不太可能再改进。

这是不可接受的,我们的任务是始终让每个人都能快速浏览网站(无需等待缓存初始化)。我想采用一种抓取网站来预热缓存的解决方案。问题在于 Web-Garden 功能似乎是一个黑盒子——您无法控制 IIS 是否/何时决定在下一个 HTTP 请求命中时加载该第二、第三或第四个进程。

对我来说,这似乎是一个常见问题,但寻找解决方案却收效甚微。我的问题是,有没有办法通过 HTTP 标头或其他构造来给 IIS 一个提示,您希望它加载或至少路由到进程 2、3、4 等?

4

3 回答 3

6

根据微软工程师的说法,这在 IIS 6 中是不可能的。但是,他们在 IIS 7.5 和 ASP.Net 4.0 中添加了一个新功能,它为我在这里寻找的东西提供了很好的功能。它被称为“preloadProvider”。这是下面的示例片段(非常酷!)。

http://forums.iis.net/p/1158476/1907392.aspx

由于单个应用程序池可以包含多个应用程序,因此您可以通过在 applicationHost.config 文件中使用以下配置来指定要自动启动的各个应用程序:

<sites>

  <site name="MySite" id="1">

    <application path="/"

         preloadEnabled="true"

         preloadProvider="PrewarmMyCache" >

        <!--  Additional content -->

    </application>

  </site>

</sites>



<!-- Additional content -->



<preloadProviders>

     <add name="PrewarmMyCache"

         type="MyNamespace.CustomInitialization, MyLibrary" />

</preloadProviders>

当 IIS 7.5 服务器冷启动或回收单个应用程序池时,IIS 7.5 使用 applicationHost.config 文件中的信息来确定需要自动启动哪些 Web 应用程序。对于标记为自动启动的每个应用程序,IIS7.5 都会向 ASP.NET 4.0 发送一个请求,以在应用程序暂时不接受 HTTP 请求的状态下启动应用程序。当它处于这种状态时,ASP.NET 实例化由 preloadProvider 属性定义的类型(如前面的示例所示)并调用其公共入口点。您可以通过实现 IProcessHostPreloadClient 接口来创建具有必要入口点的托管自动启动类型,如以下示例所示:

public class CustomInitialization :  System.Web.Hosting.IProcessHostPreloadClient

{

    public void Preload(string[]  parameters)

    {

        // Perform initialization.

    }

}

在您的初始化代码在 Preload 方法中运行并且该方法返回之后,ASP.NET 应用程序就可以处理请求了。通过在 IIS 7.5 和 ASP.NET 4.0 中添加自动启动功能,您现在有了一种定义明确的方法,可以在处理第一个 HTTP 请求之前执行昂贵的应用程序初始化。例如,您可以使用新的自动启动功能来初始化应用程序,然后向负载均衡器发出信号,表明应用程序已初始化并准备好接受 HTTP 流量。

于 2009-06-17T17:26:33.130 回答
2

也许使用 Web 监控工具来定期访问您的 Web 应用程序。除了能够在您的网站出现故障或未按预期运行时向您发送电子邮件/页面之外,此类工具还可以产生有益的副作用,即根据哪些页面和在哪些页面上保持您的网络应用程序“热”该工具将被配置为访问该站点的频率。

理论上,一旦所有请求都被初始化,IIS 将以循环方式跨花园分配传入请求。最好的办法是在您的应用程序中使用各种 URL 配置监控工具,这些 URL 不等于您花园中进程数量的直接倍数 - 否则相同的花园总是会受到相同子集的影响URLs,假设没有其他站点活动。无论如何,如果配置正确,几轮后你的花园应该都很热。

于 2009-06-16T01:53:28.963 回答
0

Microsoft 发布了一个完全符合您要求的模块。IIS 7.5的应用程序初始化模块将解决您的问题,确保您花园中的每台服务器都具有热缓存,并在收到真实用户的第一页点击时做出响应。

我认为最引人注目的功能是该模块还支持重叠进程回收。这意味着您可以回收、部署应用程序的新版本并重新启动单个服务器,而不会让任何用户卡在带有冷缓存的慢速服务器上。以下来自 IIS 8.0 的教程包含有关如何启用重叠进程回收的分步方法。

有关更多详细信息,您可以阅读我对如何在 IIS 7.5 上预热 ASP.NET MVC 应用程序中的类似问题的回答?

于 2012-09-20T20:56:31.977 回答