如何在不发生临时中断的情况下扩展我的Azure应用程序?

时间:2012-04-04 09:02:11

标签: windows api azure azure-web-roles

我正在使用Windows Azure Management API来扩展我的Azure Web角色。在某些时候,我有一个实例,并决定我想从一个实例转到两个实例。我发送HTTP POSt请求到

https://management.core.windows.net:443/<my-subscription-id>/services/hostedservices/<my-service-name>/deployments/<my-deployment-name>/?comp=config

使用XML指定与当前部署相同的配置,并将实例计数设置为2。呼叫成功,更改开始。现在大约30秒,Web角色将不接受HTTP调用 - 调用者将获得

10061 connection refused
在浏览器中

。这意味着该角色不会为客户端请求提供服务。那是个问题。

如何以始终为客户端请求提供服务的方式扩展Web角色?

2 个答案:

答案 0 :(得分:7)

根据SLA(服务水平协议 - 计算):

  

我们保证在您部署两个或更多角色实例时   面向Internet的角色将具有不同的故障和升级域   至少有99.95%的时间具有外部连接性。

这意味着SLA不支持一个实例,因此您可能(或将会)有停机时间。如果从2或更多,或从更多到2,则不会有任何中断。

This blog post概述了有关故障和升级域的良​​好解释。首先,扩展意味着“升级” - 您正在更改配置,此配置更改需要通过所有角色和实例进行传播。实现停机时间(目前)的唯一方法是至少有两个实例,每个实例都位于不同的域中。

答案 1 :(得分:0)

请注意,当您有2个或更多实例时,在修改服务配置时可能仍会遇到中断(例如,使用Service Management API更改实例数)。任何配置更改都将触发重新启动实例。

为了防止这种情况,您需要在WebRole.cs / WorkerRole.cs中实现以下代码(因此,当您更改实例数时,不会出现中断):

public override bool OnStart()
{
    RoleEnvironment.Changing += RoleEnvironmentChanging;
    return base.OnStart();
}

private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
{
    if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange))
    {
        e.Cancel = false;
    }
}

编辑:请参阅下面的astaykov评论。