首页 文章

Azure Cloud 服务角色实例 - 自动缩放 - 更改事件未触发

提问于
浏览
13

我获得了一个包含4个辅助角色的Cloud Service部署,其中一个角色启用了自动扩展 . 一旦发生自动缩放,所有角色的所有实例都将进行回收 .

理想情况下,我想停止回收角色,或者至少以受控方式终止所有其他角色的工作 .

我发现,你可以react to the RoleEnvironment.Changing event取消它以请求正常关机(即调用OnStop) . 但是,通过向Changing事件处理程序添加跟踪输出,我注意到Changing事件显然甚至没有被触发,因此取消也没有被注册 .

private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
{
    // This tracing output does not show up in the logs table.
    Trace.TraceInformation("RoleEnvironmentChanging event fired.");
    if ((e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)))
    {
        // This one neither.
        Trace.TraceInformation("One of the changes is a RoleEnvironmentConfigurationSettingChange. Cancelling..");

        e.Cancel = true;
    }
    if ((e.Changes.Any(change => change is RoleEnvironmentTopologyChange)))
    {
        // This one neither.
        Trace.TraceInformation("One of the changes is a RoleEnvironmentTopologyChange. Cancelling.");

        e.Cancel = true;
    }
}

public override bool OnStart()
{
    // Hook up to the changing event to prevent roles from unnecessarily restarting.
    RoleEnvironment.Changing += RoleEnvironmentChanging;

    // Set the maximum number of concurrent connections
    ServicePointManager.DefaultConnectionLimit = 12;

    bool result = base.OnStart();

    return result;
}

另外adding an internal endpoint对每个角色都没有带来变化 . 这里是.csdef的配置:

<WorkerRole name="MyRole" vmsize="Medium">
[...ConfigurationSettings...]
<Endpoints>
  <InternalEndpoint name="Endpoint1" protocol="http" />
</Endpoints>
</WorkerRole>

将协议更改为“任何”也不成功 .

如何在缩放操作后停止回收角色实例?

EDIT:
»包含的代码段
»修正了拼写错误

3 回答

  • -3

    你尝试过以下其中一种吗?

    • 检查是否在自动扩展的角色实例中触发了事件(以确保它不是内部 endpoints 的问题)

    • 执行完全重新部署(而不是更新) .

    • 在事件处理程序中的跟踪输出之后添加一个简短的Thread.Sleep()(有时在可以注册跟踪输出之前关闭角色)

    • 通过管理门户对其中一个配置进行更改(并检查是否触发了事件)

    • 检查是否正在触发其他事件(例如RoleEnvironment.Changed)

  • 0

    哇,超过2年没有真正的答案在这里 . 太糟糕了 . 我对该主题的体验是:如果您的实例能够在之后和缩放时工作而无需重新配置,则将e.Cancel设置为false .

    if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)){
    Trace.WriteLine("with recycle");
    e.Cancel = true;
    }
    else {
    Trace.WriteLine("without recycle");
    e.Cancel = false;
    }
    

    也许你想在OnStart上设置Trace.AutoFlush = true .

  • 2

    角色环境方法和事件您可以在五个主要位置编写代码以响应环境更改 . 其中两个,OnStart和OnStop,是RoleEntryPoint类的方法,您可以在主角色类中覆盖它们(默认情况下称为WebRole或WorkerRole) . 其他三个是RoleEnvironment类上的事件,您可以订阅它们:更改,更改和停止 .

    这些方法的目的非常清楚:

    OnStart gets called when the instance is first started.
    Changing gets called when something about the role environment is about to change.
    Changed gets called when something about the role environment has just been changed.
    

    当实例即将停止时,将调用Stopping . 在实例停止时调用OnStop . 在所有情况下,您的代码都无法阻止相应的操作发生,但您可以以任何方式对其进行响应 . 对于Changing事件,您还可以通过设置e.Cancel = true来选择是否应该回收实例以处理配置更改 .

    为什么不在我的应用程序中更改和更改触发?当我第一次开始探索这个主题时,我在Windows Azure计算模拟器(以前称为开发结构)和 Cloud 中观察到以下异常行为:

    当我进行配置更改时,更改和更改事件未在任何实例上触发 . 即使角色中有多个实例,RoleEnvironment.CurrentRoleInstance.Role.Instances.Count也始终返回1 . 事实证明,这是在角色没有定义内部 endpoints 时的预期行为,如本MSDN文章中所述 . 所以解决方案就是在ServiceDefinition.csdef文件中定义一个内部 endpoints ,如下所示:

    <Endpoints>
      <InternalEndpoint name=”InternalEndpoint1″ protocol=”http” />
    </Endpoints>
    

    哪些事件在何时何地发生?即使事件的名称看起来非常明显,但在上下调整部署时的确切行为并不一定是您所期望的 . 下图显示了包含单个角色的示例方案中触发的事件 . 最初部署了2个实例,然后将部署扩展到4个实例,然后再降低到3个实例,最后部署停止 .

    取自http://azure.microsoft.com/blog/2011/01/04/responding-to-role-topology-changes/

相关问题