部署后,Azure Web角色预热

时间:2017-02-20 23:08:20

标签: azure asp.net-web-api webrole warm-up

正如此处的各种其他相关问题所述,我也希望在(重新)部署具有相当大的EF6模型和大量引用的nuget-packages的Web角色之后进行长时间(30秒)的首次调用。在用preloadEnabledserviceAutoStartProviders尝试不同的建议解决方案后,我仍然被消费,并决定重新打开这个主题,希望有人在此期间找到了更好的解决方案。

我的主要目标是,一旦角色在全新部署中退出繁忙状态并且负载均衡器和外部客户端可以访问,就可以使Web角色以后续呼叫的速度响应第一个请求。不幸的是,到目前为止我遇到了以下问题:

  1. preloadEnabled

    • 我在启动任务中通过PKGMGR.EXE /iu:IIS-ApplicationInit添加了应用程序初始化模块。到现在为止还挺好。
    • 当我尝试执行%windir%\system32\inetsrv\appcmd set site "MySiteName" -applicationDefaults.preloadEnabled:true时,它在执行启动脚本时失败,在新部署中仍然没有在IIS中创建网站。
    • 如果我尝试在ServerManager方法中通过Application_Start - 类设置preloadEnabled设置,我无法理解,此代码是如何在网络上首次外部调用之前执行的由于preloadEnabled设置在新的Web角色部署后默认为false,因此我的理解中的Application_Start方法没有机会被Application Initialization模块执行,所以会产生角色吗?
  2. serviceAutostartProviders

    • 这里我们需要在applicationhost.config中设置实现IProcessHostPreloadClient接口的AutostartProvider的名称,即使用appcmd脚本或ServerManager类,但是:
      • serviceAutostartProvider就像preloadEnabled一样,与站点相关的设置,所以我们在1.2中遇到与%windir%\system32\inetsrv\appcmd set site "MySiteName" -applicationDefaults.preloadEnabled:true相同的问题 - 在重新部署后的启动脚本执行时,尚未在IIS和脚本中创建网站无法正确执行
      • 另一种可能性是将applicationhost.config包含到部署包中,但我没有找到任何解决方案来为Web角色执行此操作。
  3. 那么你们是如何设法确保预加载程序集和一些初始化代码(如填充内存缓存)是之前角色首次从外部命中?

    我们现在开始获得一些流量并获得约。在我们的WebApi上每秒1-2次请求,因此预加载时间延迟30秒"可见"每次更新部署后,客户现在都成为一个主要问题。

    我们正在以较低的流量时间安排更新部署,但是如果我需要进行紧急修补程序部署呢?

2 个答案:

答案 0 :(得分:1)

实现此目的的最佳方法可能是使用部署插槽。首先将更新部署到暂存槽。在从暂存插槽切换到生产插槽之前,Kudu将使用请求命中暂存插槽的根目录以便预热应用程序。在对staging slot的root用户返回请求后,会发生IP切换,并且交换插槽。

但是,有时您需要预热其他页面或服务以使应用程序准备好处理流量,并且使用预热请求命中根目录是不够的。您可以更新web.config,以便Kudu在IP切换发生之前触及其他页面和端点,并且交换插槽。

这些预热请求网址应位于代码中。这是一个例子:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <applicationInitialization>
      <add initializationPage="/pagetowarmup1" />
      <add initializationPage="/pagetowarmup2" />
      <add initializationPage="/pagetowarmup3" />
    </applicationInitialization>
  </system.webServer>
</configuration>

您可以在此问题here上阅读Kudu文档。

答案 1 :(得分:0)

行。现在我明白了。

重点是设置preloadEnabled - 属性不在Global.asax中Application_Start方法的内部(因为它在第一次请求角色之前不会被命中),但是在{{ 1}}。

不同之处在于,在提取部署包并为启动角色设置所有内容后,将直接调用RoleEntryPoint.OnStart。此时,只要正在执行RoleEntryPoint.OnStart中的某些代码,azure实例仍处于忙碌状态,并且尚未从外部可用。

所以这是我到目前为止为在第一次调用外部之前预热实例的代码

RoleEntryPoint.OnStart
相关问题