Azure Web Role "разогревает" стратегии

Я обнаружил, что выполнение запросов к нашей веб-роли после периодов бездействия приведет к очень медленному запросу (до 30 секунд). После этого первоначального запроса роль будет выполняться так, как должна.

После долгих поисковых запросов я столкнулся с четырьмя различными стратегиями (перечисленными ниже):

(a) Отключение тайм-аута простоя IIS в RoleEntryPoint.OnStart()

public override bool OnStart()
{
    using (var server = new ServerManager())
    {
        server.ApplicationPoolDefaults.ProcessModel.IdleTimeout = TimeSpan.Zero;
        server.CommitChanges();
    }

    return base.OnStart();
}

Это также требует, чтобы роль выполнялась на повышенном уровне.

(b) Выполнять регулярные запросы в 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) Установите preloadEnabled и startMode в 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) И, наконец, используя Azure "Always On" (EDIT: это только для сайтов Azure, к сожалению!)

Azure Role Always On

Какую из этих стратегий я должен выполнить?

Ответы

Ответ 1

Мы используем комбинацию из двух этих ответов, и она отлично работает для нас, они очень быстро меняются и тестируются, но, похоже, охватывают все базы.

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();
}

Ответ 2

Рассматривали ли вы использование мониторинга конечных точек Azure для мониторинга и запуска своей роли для ответа каждые 5 минут? Он встроен в Azure и там не нужен код.

http://azure.microsoft.com/en-us/documentation/articles/web-sites-monitor/