我一直在使用Autoscale在2到1个云服务实例之间切换,以降低成本。这主要是有效的,除了不时(不确定这里的模式是什么),放大(1-> 2)的行为导致两个实例回收,产生服务中断对于用户。
假设RoleEntry在响应拓扑更改时没有花哨的东西,为什么从1-> 2扩展会重新启动已经运行的实例?
附加说明:
答案 0 :(得分:2)
这一直是这样的。当您运行1台服务器并且转到2+时,将重新启动初始服务器。要获得完整的SLA,您需要始终拥有2台以上的服务器。
答案 1 :(得分:0)
您应该能够控制此行为。在roleEntrypoint
中,您可以捕获一个事件,RoleEnvironmentChanging
。
要放入解决方案的一些代码的shell看起来像......
RoleEnvironment.Changing += RoleEnvironmentChanging;
private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
{
}
RoleEnvironment.Changed += RoleEnvironmentChanged;
private void RoleEnvironmentChanged(object sender, RoleEnvironmentChangedEventArgs e)
{
}
然后,在RoleEnvironmentChanged方法中,我们可以检测到更改的内容,并告诉Azure是否要重新启动。
if ((e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)))
{
e.Cancel = true; // don't recycle the role
}
答案 2 :(得分:0)
Nariman,请参阅我对布伦特的帖子的评论,了解有关正在发生的事情的一些信息。您应该能够使用以下代码解决此问题:
public class WebRole : RoleEntryPoint
{
public override bool OnStart()
{
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
IPHostEntry ipEntry = Dns.GetHostEntry(Dns.GetHostName());
string ip = null;
foreach (IPAddress ipaddress in ipEntry.AddressList)
{
if (ipaddress.AddressFamily.ToString() == "InterNetwork")
{
ip = ipaddress.ToString();
}
}
string urlToPing = "http://" + ip;
HttpWebRequest req = HttpWebRequest.Create(urlToPing) as HttpWebRequest;
WebResponse resp = req.GetResponse();
return base.OnStart();
}
}