【问题标题】:Azure Cloud Service : Scaled in web site (web role) instance recieves requests before iis is readyAzure 云服务:在 iis 准备好之前扩展网站(Web 角色)实例接收请求
【发布时间】:2014-11-06 12:19:36
【问题描述】:

说明

我获得了一个托管在作为网站的云服务中的网络角色。 我们通过自定义监控(工作者角色)处理可预测的负载峰值,该监控将根据预测的负载配置文件定期扩展或扩展。 那部分正在工作。

问题

在监控挂载网站的新实例后,我们刚刚遇到一个用户的案例,该用户的请求在新实例完全加载之前到达了该新实例。这导致 Web 浏览器上出现无法访问的网站空白页面。鉴于我们典型的目标客户,这是非常糟糕的。 当测试人员大约在扩展过程中(第一次)连接到网站时,就会发生这种情况。

我的问题是,有没有办法确保 Web 角色已完全加载 IIS7、启动应用程序池并在任何请求被定向到它之前完成所有网站预热过程? 或者以更一般的方式,我们可以手动决定负载均衡器可以使用哪个实例吗?我的意思是我假设在云服务上有一个内置的负载均衡器自动分发请求。

提前致谢。

【问题讨论】:

    标签: iis azure azure-cloud-services


    【解决方案1】:

    请参阅 https://docs.microsoft.com/en-us/archive/blogs/kwill/role-instance-restarts-due-to-os-upgrades,特别是常见问题 #5 和相关代码。

    如果您的网站需要几分钟来预热(无论是标准 IIS/ASP.NET 预编译和模块加载的预热,或预热 缓存或其他特定于应用程序的任务),那么您的客户可能会遇到 中断或随机超时。在角色实例重新启动并且您的 OnStart 代码完成,然后您的角色实例将被放回 负载均衡器轮换并将开始接收传入请求。如果 您的网站仍在预热,然后所有这些传入请求 将排队并超时。如果您的网站只有 2 个实例 角色然后 IN_0,仍在预热中,将占 100% 正在为来宾操作系统重新启动 IN_1 时的传入请求 更新。这可能会导致您的服务完全中断,直到您 网站在这两种情况下都已完成预热。推荐 将您的实例保持在 OnStart 中,这将使其保持在忙碌状态 它不会接收来自负载均衡器的传入请求,直到 你的热身已经完成。您可以使用以下代码来完成 这个:

    public class WebRole : RoleEntryPoint
    {
        public override bool OnStart()
        {
            // For information on handling configuration changes
            // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
            IPHostEntry ipEntry = Dns.GetHostEntry(Dns.GetHostName());
            string ip = null;
            foreach (IPAddress ipaddress in ipEntry.AddressList)
            {
                if (ipaddress.AddressFamily.ToString() == "InterNetwork")
                {
                    ip = ipaddress.ToString();
                }
            }
    
            string urlToPing = "http://" + ip;
            HttpWebRequest req = HttpWebRequest.Create(urlToPing) as HttpWebRequest;
            WebResponse resp = req.GetResponse();
            return base.OnStart();
        }
    }
    

    【讨论】:

    • 谢谢kwill,这正是我想要的。由于部署政策,我将无法很快对其进行测试,但当我得到更多结果时,我会及时更新这篇文章。
    • 我测试了它并且它工作。我将这个方法的内容包裹在一段时间内([boolean]),以确保它不会因为 TimeOutException 而继续。
    • 这似乎是一个可行的解决方案。阅读它时,我想知道您为什么要获取/一个 IPv4 地址,而不仅仅是使用 localhost 作为主机名?
    • 您好,一月。本地主机绑定未设置,因此无法正常工作。您必须浏览到本地 IP 地址。
    • @kwill 我会使用您的解决方案并且它对我来说工作正常。只是想检查这种方法是否有任何缺点?
    【解决方案2】:

    聚会迟到了,但云服务位于负载平衡器后面。负载均衡器具有探测功能,可评估应用程序实例是否可以接收请求。您可以将探针配置为向应用程序实例发出 http 请求,以检查应用程序是启动还是关闭,以及其他设置。

    -- 负载均衡器信息

    http://azure.microsoft.com/blog/2014/04/08/microsoft-azure-load-balancing-services/

    -- 服务定义中的详细配置

    https://msdn.microsoft.com/en-us/library/azure/jj151530.aspx

    【讨论】:

    • 感谢您的信息。我们不适合 kwill 解决方案,但我下次会看看。
    • 仅供参考,由于我的回答中描述的问题,此解决方案将不起作用。在来宾操作系统更新期间,如果 IN_0 重新启动并返回到运行状态,则 IN_1 将继续重新启动以进行操作系统更新。负载均衡器探测的状态不会影响角色实例的状态,因此即使您的实例不在 LB 轮换状态(因为您的站点仍在预热),那么您最终仍然会导致两个实例同时关闭,导致完全中断。最好控制角色实例状态,防止两个实例都宕机。
    猜你喜欢
    • 2015-10-04
    • 2018-04-12
    • 2015-07-31
    • 2014-09-21
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多