2015-02-23 45 views
1

我有一個web角色部署到兩個實例,應用程序池回收超時設置爲默認值29小時,並且應用程序池空閒超時設置爲零。我想保留這個應用程序池回收時間,以確保我的應用程序在一段時間內保持健康。不過,我不希望我的兩個實例(意外)在同一時間回收,以確保我的應用程序對用戶保持響應。蔚藍防止角色實例在同一時間被回收嗎?

是否azure保證多個實例的應用程序池不會在同一時間被回收?否則:我怎樣才能防止這種情況?

回答

0

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(); 
     } 
    } 
} 
相關問題