【问题标题】:Azure Web Role warm up after Deploy部署后 Azure Web 角色预热
【发布时间】:2017-02-22 22:30:26
【问题描述】:

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

我的主要目标是让 Web 角色在新部署中退出其忙碌状态并可由负载平衡器和外部客户端访问时,几乎与后续调用一样快地响应第一个请求。不幸的是,到目前为止,我在提出的解决方案中遇到了以下问题:

  1. preloadEnabled:

    • 我确实通过PKGMGR.EXE /iu:IIS-ApplicationInit 在启动任务中添加了应用程序初始化模块。到目前为止,一切都很好。
    • 当我尝试执行 %windir%\system32\inetsrv\appcmd set site "MySiteName" -applicationDefaults.preloadEnabled:true 时,它会失败,因为在执行启动脚本时,在全新部署的 IIS 中仍然没有创建任何网站。
    • 如果我尝试在我的Application_Start 方法中通过ServerManager-class 设置preloadEnabled-setting,我无法理解,在对网络角色进行第一次外部调用之前如何执行此代码,因为在新的 Web 角色部署后 preloadEnabled 设置默认为 false,因此我理解的 Application_Start 方法没有机会被应用程序初始化模块执行?
  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 角色执行此操作。

那么你们是如何设法确保预加载程序集和一些初始化代码(如填充内存缓存)在角色从外部首次受到攻击之前运行的?

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

我们在低流量时间安排更新部署,但如果我需要进行紧急修补程序部署怎么办?

【问题讨论】:

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


    【解决方案1】:

    也许实现此目的的最佳方法是使用部署槽。首先将更新部署到您的暂存槽。在从暂存槽切换到生产槽之前,Kudu 将向暂存槽的根发出请求以预热应用程序。在对暂存槽根的请求返回后,会发生 IP 切换并交换您的槽。

    但是,有时您需要预热其他页面或服务以使应用准备好处理流量,而通过预热请求访问根目录是不够的。您可以更新您的 web.config,以便 Kudu 在 IP 切换和插槽被交换之前访问其他页面和端点。

    这些预热请求 URL 应该在标记中。这是一个例子:

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

    您可以阅读有关此问题的 Kudu 文档here。

    【讨论】:

    • 谢谢。但是您的插槽解决方案是否也适用于 Web 角色?据我所知,这只是 Azure Web Apps 的一项功能?
    【解决方案2】:

    好的。现在我明白了。

    重点是不要在 Global.asax 中的 Application_Start 方法内设置 preloadEnabled-property(因为无论如何它不会在第一次请求角色之前被命中),而是在 RoleEntryPoint.OnStart 内。

    不同的是RoleEntryPoint.OnStart是在部署包解压后直接调用,一切都准备好启动角色了。目前,azure 实例仍处于忙碌状态,只要 RoleEntryPoint.OnStart 中的某些代码正在执行,就无法从外部访问。

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

    public class WebRole : RoleEntryPoint
    {
        public override bool OnStart()
        {
            // set preloadEnabled of each Site in this deployment to true
            using (var serverManager = new ServerManager())
            {
                foreach (var mainSite in serverManager.Sites)
                {
                    var mainApplication = mainSite.Applications["/"];
                    mainApplication["preloadEnabled"] = true;
                }
                serverManager.CommitChanges();
            }
    
            // call my warmup-code which will preload caches and do some other time consuming preparation
            var localuri = new Uri(string.Format("https://{0}/api/warmup", RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"].IPEndpoint));
            try
            {
                var request = (HttpWebRequest)WebRequest.Create(localuri);
                request.Method = "GET";
                var response = request.GetResponse();
            }
            catch { }
    
            // send this thread to sleep in order to give the warmup-request a chance to complete BEFORE the Role will get started 
            // and becomes available to the outside world
            System.Threading.Thread.Sleep(60000);
    
    
            return base.OnStart();
        }
    
    
    }
    

    【讨论】:

    • 在这种情况下,您创建的 WebRequest 由 Full IIS 创建的 HttpApplication 处理,而不是由执行预热代码的同一进程处理,对吗?
    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多