在 .net 4.5.2 和 OS 系列“4”(Windows 2012)上使用 Azure SDK 3.0 部署到 Azure 云服务WebRoles (2)。
当web 应用程序启动时,我们想要加载一个缓存(从 blob 存储),这大约需要 10 分钟(我们已经考虑过移动它,但目前不能)
然后当 IIS 应用程序池回收时,我们希望站点保持正常运行。
目前,云服务的默认 IIS 设置是:
- 不启动加载(autoStart / startMode)
- 每 20 分钟空闲一次 (idleTimeout)
- 每 29 小时循环一次 (periodicRestart)
- 以 HTTP 503 的形式出现故障 (loadBalancerCapabilities)
因为我们默认为 2 个 WebHost,所以我们要在不同的时间回收应用程序池。理想情况下,如果其中一个虚拟主机正在加载缓存,我们希望重定向来自站点的现有连接。
到目前为止,我们有一个启动任务脚本来重新配置 IIS AppPools
appcmd set config -section:system.applicationHost/applicationPools
和
/applicationPoolDefaults.autoStart:"True"
/applicationPoolDefaults.startMode:"AlwaysRunning"
/applicationPoolDefaults.processModel.idleTimeout:"00:00:00"
/applicationPoolDefaults.recycling.logEventOnRecycle:"Time,Requests,Schedule,Memory,IsapiUnhealthy,OnDemand,ConfigChange,PrivateMemory"
/applicationPoolDefaults.recycling.periodicRestart.time:"00:00:00"
/~"applicationPoolDefaults.recycling.periodicRestart.schedule"
/+"applicationPoolDefaults.recycling.periodicRestart.schedule.[value='06:00:00']"
/applicationPoolDefaults.failure.loadBalancerCapabilities:"TcpLevel"
例如
%windir%\system32\inetsrv\appcmd set config -section:applicationPools /applicationPoolDefaults.autoStart:"True" /commit:apphost
至于代码,我们已经研究了Busy
在缓存加载之前使用标志。这似乎不会重新路由流量
RoleEnvironment.StatusCheck += WebRoleEnvironment_StatusCheck;
和
if (Busy)
{
e.SetBusy();
}
缺点是这是在Application_Start
需要容器的情况下完成的。我认为将其LoadCache()
移入OnStart()
.RoleEntryPoint
笔记; 默认情况下,我们还启用了“保持活动”。
问题;
- 我们如何在加载缓存时让 WebHost 脱机?
- 我们应该更改 IIS 设置吗?https://azure.microsoft.com/en-gb/blog/iis-reset-on-windows-azure-web-role/
- 我们应该使用 IIS 8.0 应用程序初始化吗?http://fabriccontroller.net/iis-8-0-application-initialization-module-in-a-windows-azure-web-role/
- loadBalancerCapabilities 应该设置什么?https://docs.microsoft.com/en-us/iis/configuration/system.applicationhost/applicationpools/add/failure
- 我们应该尝试错开回收吗?当我们扩展(添加更多实例)时,Azure 会阻止角色实例同时被回收吗?