Azure云服务:在网站(Web角色)实例中扩展,在iis准备好之前接收请求

时间:2014-11-06 12:19:36

标签: iis azure azure-cloud-services

描述

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

问题

在监控装载了新的网站实例之后,我们遇到了一个用户的情况,其请求在新实例完全加载之前到达新实例。它导致Web浏览器上无法访问的网站空白页面。鉴于我们的典型目标客户端非常糟糕。 这种情况发生在测试人员(在大规模处理过程中)大约连接(第一次)到网站时。

我的问题是,有没有办法确保Web角色已完全加载IIS7,启动apppool并完成所有网站预热流程,然后才会将任何请求发送给它? 或者以更一般的方式,我们可以手动确定负载均衡器可用的实例吗?我的意思是,我认为在云服务上有一个内置的负载均衡器,可以自动分发请求。

提前致谢。

1 个答案:

答案 0 :(得分:4)

请参阅http://blogs.msdn.com/b/kwill/archive/2012/09/19/role-instance-restarts-due-to-os-upgrades.aspx,特别是常见问题#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();
    }
}