1
我有一個web角色部署到兩個實例,應用程序池回收超時設置爲默認值29小時,並且應用程序池空閒超時設置爲零。我想保留這個應用程序池回收時間,以確保我的應用程序在一段時間內保持健康。不過,我不希望我的兩個實例(意外)在同一時間回收,以確保我的應用程序對用戶保持響應。蔚藍防止角色實例在同一時間被回收嗎?
是否azure保證多個實例的應用程序池不會在同一時間被回收?否則:我怎樣才能防止這種情況?
我有一個web角色部署到兩個實例,應用程序池回收超時設置爲默認值29小時,並且應用程序池空閒超時設置爲零。我想保留這個應用程序池回收時間,以確保我的應用程序在一段時間內保持健康。不過,我不希望我的兩個實例(意外)在同一時間回收,以確保我的應用程序對用戶保持響應。蔚藍防止角色實例在同一時間被回收嗎?
是否azure保證多個實例的應用程序池不會在同一時間被回收?否則:我怎樣才能防止這種情況?
Azure不會監視w3wp或您的應用程序池,也不會協調不同實例之間的回收時間。爲了防止同時在多個實例之間應用程序池回收,您應該修改每個實例的時間,例如類似< 29小時+ IN_#* 1小時>以使得IN_0將下注設置爲29小時,IN_1設爲30, IN_2在31等
我的同事提供這樣的代碼:
using System;
using System.Threading.Tasks;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.Web.Administration;
namespace RoleEntry
{
public class Role : RoleEntryPoint
{
public override bool OnStart()
{
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
int instanceScheduleTime = 0;
int.TryParse(RoleEnvironment.CurrentRoleInstance.Id.Substring(RoleEnvironment.CurrentRoleInstance.Id.LastIndexOf("_") + 1),out instanceScheduleTime);
string roleId = string.Format("{0:D2}",(instanceScheduleTime % 24));
TimeSpan scheduledTime = TimeSpan.Parse(roleId + ":00:00");
using (ServerManager serverManager = new ServerManager())
{
Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection applicationPoolsSection = config.GetSection("system.applicationHost/applicationPools");
ConfigurationElement applicationPoolDefaultsElement = applicationPoolsSection.GetChildElement("applicationPoolDefaults");
ConfigurationElement recyclingElement = applicationPoolDefaultsElement.GetChildElement("recycling");
ConfigurationElement periodicRestartElement = recyclingElement.GetChildElement("periodicRestart");
ConfigurationElementCollection scheduleCollection = periodicRestartElement.GetCollection("schedule");
bool alreadyScheduled = false;
foreach (ConfigurationElement innerSchedule in scheduleCollection)
{
if ((TimeSpan)innerSchedule["value"] == scheduledTime)
alreadyScheduled = true;
}
if (!alreadyScheduled)
{
ConfigurationElement addElement1 = scheduleCollection.CreateElement("add");
addElement1["value"] = scheduledTime;
scheduleCollection.Add(addElement1);
serverManager.CommitChanges();
}
}
return base.OnStart();
}
}
}