10

我一直在使用 Autoscale 在 2 和 1 个云服务实例之间切换,以降低成本。这主要是有效的,除了有时(不确定这里的模式似乎是什么),扩展(1->2)的行为会导致两个实例进行回收,从而为用户产生服务中断。

假设 RoleEntry 响应拓扑变化没有任何花哨的事情发生,为什么要从 1->2 缩放重新启动已经运行的实例?

补充说明:

  • 通过查看管理门户中的实例选项卡,很明显这两个实例都在回收。中断也可以通过点击公共站点来确认。
  • 它不会始终如一地发生,但我不确定模式是什么。感觉就像当 1-instance 配置已经运行了多天时,尝试扩大回收两者。但是,如果 1-instance 配置仅运行了几个小时,您可以在不中断的情况下进行扩展和缩减。
  • 第一个实例的返回速度总是比引入的第二个实例快得多。
4

3 回答 3

2

一直都是这样。当您运行 1 个服务器并转到 2+ 时,初始服务器将重新启动。为了获得完整的 SLA,您需要始终拥有 2 台以上的服务器。

于 2014-03-07T19:35:07.470 回答
0

您应该能够控制这种行为。在 中roleEntrypoint,有一个你可以捕获的事件,RoleEnvironmentChanging

将一些代码放入您的解决方案的外壳看起来像......

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
}
于 2014-03-07T20:00:06.593 回答
0

Nariman,有关正在发生的事情的一些信息,请参阅我对 Brent 帖子的评论。您应该能够使用以下代码解决此问题:

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();
    }
}
于 2014-03-08T05:15:28.760 回答