Estrategias de "calentamiento" del rol de la web de Azure
azure-web-roles iis-8 (2)
Descubrí que realizar solicitudes a nuestro rol web después de períodos de inactividad daría como resultado una solicitud muy lenta (hasta 30 segundos). Después de esa solicitud inicial, el rol se desempeñaría como debería.
Después de muchas búsquedas en Google, encontré cuatro estrategias diferentes (enumeradas a continuación):
(a) Desactivación del tiempo de espera de inactividad de IIS en RoleEntryPoint.OnStart()
public override bool OnStart()
{
using (var server = new ServerManager())
{
server.ApplicationPoolDefaults.ProcessModel.IdleTimeout = TimeSpan.Zero;
server.CommitChanges();
}
return base.OnStart();
}
Esto también requiere que el rol se ejecute en un nivel elevado.
(b) Realizar solicitudes regulares en RoleEntryPoint.Run()
public override void Run()
{
var localuri = new Uri(string.Format("https://{0}/Help", RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["HttpsIn"].IPEndpoint));
while (true)
{
try
{
var request = (HttpWebRequest)WebRequest.Create(localuri);
request.Method = "GET";
var response = request.GetResponse();
}
catch { }
System.Threading.Thread.Sleep(3000);
}
}
(c) Establezca preloadEnabled
y startMode
en RoleEntryPoint.OnStart()
public override void OnStart()
{
using (var serverManager = new ServerManager())
{
foreach (var application in serverManager.Sites.SelectMany(x => x.Applications))
{
application["preloadEnabled"] = true;
}
foreach (var applicationPool in serverManager.ApplicationPools)
{
applicationPool["startMode"] = "AlwaysRunning";
}
serverManager.CommitChanges();
}
return base.OnStart();
}
(d) Y por último, usando Azure "Always On" (EDITAR: ¡Esto es solo para los sitios web de Azure, desafortunadamente!)
¿Cuál de estas estrategias debo realizar?
¿Ha considerado utilizar el monitoreo de puntos finales de Azure para monitorear y desencadenar su rol para responder cada 5 minutos? Está integrado en Azure y no se necesita ningún código.
http://azure.microsoft.com/en-us/documentation/articles/web-sites-monitor/
Usamos una combinación de un par de esas respuestas y funciona perfectamente bien para nosotros, son muy rápidas de cambiar y probar, sin embargo, parece cubrir todas las bases.
public override bool OnStart()
{
ServicePointManager.DefaultConnectionLimit = 12;
if(!RoleEnvironment.IsEmulated)
{
using(ServerManager serverManager = new ServerManager())
{
foreach (var app in serverManager.Sites.SelectMany(x => x.Applications))
{
app["preloadEnabled"] = true;
}
foreach (var appPool in serverManager.ApplicationPools)
{
appPool.AutoStart = true;
appPool["startMode"] = "AlwaysRunning";
appPool.ProcessModel.IdleTimeout = TimeSpan.Zero;
appPool.Recycling.PeriodicRestart.Time = TimeSpan.Zero;
}
serverManager.CommitChanges();
}
}
return base.OnStart();
}