10

コストを削減するために、Autoscale を使用してクラウド サービスのインスタンスを 2 つから 1 つに切り替えています。これはほとんど機能しますが、時折 (ここでどのようなパターンがあるかはわかりません)、スケールアップ (1->2) することで両方のインスタンスがリサイクルされ、ユーザーのサービス停止が発生します。

トポロジの変更に応じて RoleEntry で特別な処理が行われないと仮定すると、なぜ 1 から 2 へのスケーリングで既に実行中のインスタンスが再起動されるのでしょうか?

その他の注意事項:

  • 管理ポータルの [インスタンス] タブを見ると、両方のインスタンスがリサイクルされていることがわかります。停止は公開サイトを叩いても確認できます。
  • 一貫して発生するわけではありませんが、パターンが何であるかはわかりません。1 インスタンス構成が数日間実行されている場合、スケールアップを試みると両方がリサイクルされるように感じます。ただし、1 インスタンス構成が数時間しか実行されていない場合は、停止することなくスケールアップおよびスケールダウンできます。
  • 最初のインスタンスは、導入された 2 番目のインスタンスよりもはるかに速く戻ります。
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 に答える