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

Ben*_*Sch 13 .net c# azure azure-worker-roles azure-cloud-services

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

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

我发现,您可以对RoleEnvironment.Changing事件做出反应并取消它以请求正常关闭(即调用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;
}
Run Code Online (Sandbox Code Playgroud)

此外,为每个角色添加内部端点并未带来更改.这里是.csdef的配置:

<WorkerRole name="MyRole" vmsize="Medium">
[...ConfigurationSettings...]
<Endpoints>
  <InternalEndpoint name="Endpoint1" protocol="http" />
</Endpoints>
</WorkerRole>
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:
»包含的代码片段
»修正了拼写错误

Bar*_*dem -3

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

\n\n

这些方法的目的从它们的名称中就很清楚了:

\n\n
OnStart gets called when the instance is first started.\nChanging gets called when something about the role environment is about to change.\nChanged gets called when something about the role environment has just been changed.\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

为什么\xe2\x80\x99t 在我的应用程序中进行更改和更改?\n当我第一次开始探索此主题时,我在 Windows Azure 计算模拟器(以前称为 Development Fabric)和云中观察到以下异常行为:

\n\n

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

\n\n
<Endpoints>\n  <InternalEndpoint name=\xe2\x80\x9dInternalEndpoint1\xe2\x80\xb3 protocol=\xe2\x80\x9dhttp\xe2\x80\x9d />\n</Endpoints>\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n

  • 感谢你的回答。但仅仅复制粘贴一个我什至包含在我的问题中并指出这不起作用的网站,对我来说没有多大帮助,抱歉!还有其他想法为什么这对我不起作用吗? (2认同)