【问题标题】:Azure Cloud Service role instances - auto-scaling - Changing event not firingAzure 云服务角色实例 - 自动缩放 - 更改事件未触发
【发布时间】:2015-06-30 08:22:33
【问题描述】:

我得到了一个包含 4 个工作角色的云服务部署,其中一个启用了自动扩展。一旦发生自动缩放,所有角色的所有实例都会被回收。

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

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

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>

将协议更改为“any”也没有成功。

如何在扩展操作后阻止我的角色实例回收?

编辑:
» 包含代码 sn-ps
» 修正错别字

【问题讨论】:

    标签: c# .net azure azure-worker-roles azure-cloud-services


    【解决方案1】:

    哇,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】:

      您是否尝试过以下方法之一?

      • 检查事件是否在自动缩放的角色实例中被触发(以确保内部端点没有问题)
      • 执行完整的重新部署(而不是更新)。
      • 在事件处理程序中的跟踪输出之后添加一个简短的 Thread.Sleep()(有时在可以注册跟踪输出之前关闭角色)
      • 通过管理门户更改其中一个配置(并检查是否触发了事件)
      • 检查是否正在触发其他事件(例如 RoleEnvironment.Changed)

      【讨论】:

      • 感谢您的这些提示,保罗。不幸的是,这些都没有给我带来成功。这就是为什么我不会将您的答案标记为已接受,因为它可能会误导其他用户。但是,由于您的回答显示了提供帮助的最大努力,因此我会将赏金奖励给您。如果您有进一步的想法,请告诉我!
      【解决方案3】:

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

      这些方法的用途从它们的名字就很清楚了:

      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.
      

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

      为什么没有在我的应用程序中触发 Change 和 Changed? 当我第一次开始探索这个主题时,我在 Windows Azure Compute Emulator(以前称为 Development Fabric)和云中都观察到了以下异常行为:

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

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

      哪些事件在何时何地触发? 尽管事件的名称看起来很不言自明,但向上和向下扩展部署时的确切行为不一定是您所期望的。下图显示了在包含单个角色的示例场景中触发了哪些事件。最初部署了 2 个实例,然后将部署扩展到 4 个实例,然后缩减到 3 个,最后停止部署。

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

      【讨论】:

      • 感谢您的回答。但是仅仅复制粘贴一个我什至包含在我的问题中并声明这不起作用的网站,对我没有多大帮助,对不起!任何其他想法为什么这对我不起作用?
      猜你喜欢
      • 2015-10-04
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 2016-06-14
      • 2016-04-28
      • 1970-01-01
      • 2015-07-31
      相关资源
      最近更新 更多