描述
我在一个网站的云服务中托管了一个Web角色。 我们使用自定义监视(工作者角色)处理可预测的负载峰值,该监视将根据预测的负载配置文件定期扩展或扩展。 那部分正在发挥作用。
问题
在监控装载了新的网站实例之后,我们遇到了一个用户的情况,其请求在新实例完全加载之前到达新实例。它导致Web浏览器上无法访问的网站空白页面。鉴于我们的典型目标客户端非常糟糕。 这种情况发生在测试人员(在大规模处理过程中)大约连接(第一次)到网站时。
我的问题是,有没有办法确保Web角色已完全加载IIS7,启动apppool并完成所有网站预热流程,然后才会将任何请求发送给它? 或者以更一般的方式,我们可以手动确定负载均衡器可用的实例吗?我的意思是,我认为在云服务上有一个内置的负载均衡器,可以自动分发请求。
提前致谢。
答案 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();
}
}