Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Azure云服务角色实例-自动缩放-未触发更改事件_C#_.net_Azure_Azure Worker Roles_Azure Cloud Services - Fatal编程技术网

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

C# Azure云服务角色实例-自动缩放-未触发更改事件,c#,.net,azure,azure-worker-roles,azure-cloud-services,C#,.net,Azure,Azure Worker Roles,Azure Cloud Services,我得到了一个具有4个工作者角色的云服务部署,其中一个启用了自动伸缩。一旦发生自动缩放,所有角色的所有实例都将被回收 理想情况下,我希望停止角色循环,或者至少以可控的方式终止所有其他角色的工作 我发现,你可以取消它并请求一个优雅的关机(即,调用makeonstop)。然而,通过向变更事件处理程序添加跟踪输出,我注意到变更事件显然甚至没有被触发,因此取消也没有被注册 private void RoleEnvironmentChanging(object sender, RoleEnvironment

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

理想情况下,我希望停止角色循环,或者至少以可控的方式终止所有其他角色的工作

我发现,你可以取消它并请求一个优雅的关机(即,调用makeonstop)。然而,通过向变更事件处理程序添加跟踪输出,我注意到变更事件显然甚至没有被触发,因此取消也没有被注册

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;
}
也给每个角色带来了变化。下面是.csdef中的配置:

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

[…配置设置…]
将协议更改为“任何”也没有成功

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

编辑:
»包含的代码片段

»固定打字错误

角色环境方法和事件 您可以在五个主要位置编写代码以响应环境更改。其中两个是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。 在所有情况下,您的代码都无法阻止相应的操作发生,但是您可以以任何方式响应它。在发生更改事件的情况下,您还可以通过设置e.Cancel=true来选择是否应回收实例以处理配置更改

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

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

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

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


摘自

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

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

    • 哇,两年多了,这里没有一个真正的答案。太糟糕了。 我的经验是: 如果您的实例在扩展之后和扩展期间能够工作,而无需重新配置,请将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。

      谢谢您的回答。但是,仅仅复制粘贴一个网站,我甚至在我的问题中包括,并表示这不起作用,是不是对我很有帮助,对不起!还有什么其他的想法为什么这对我不起作用吗?谢谢你的提示,保罗。不幸的是,这些都没有给我带来成功。这就是为什么我不会将您的答案标记为已接受,因为它可能误导其他用户。然而,由于你的回答显示了在提供帮助方面的最大努力,我将把赏金授予你。如果你有进一步的想法,请告诉我!