在Azure Cloud实例执行哪种类型的异常/崩溃后重新启动?

时间:2012-01-10 08:48:51

标签: .net azure cloud paas

据我记忆,角色实例应该在崩溃/失败后自动执行重启。 为了测试这种行为,我写了一个应用程序来强制执行内存不足异常并且我的应用程序崩溃了。角色实例没有执行重启,因为它仍在运行且没问题 - 实例只是重新启动.NET运行时。

我试图找出实例如何对不同的错误做出反应。在我的情况下,没有必要重新启动。什么类型的错误/异常(我可以强制执行)会导致实例完全重启?什么类型的错误/异常会永远杀死一个实例?

1 个答案:

答案 0 :(得分:12)

导致角色实例被回收(重新启动)的唯一原因是Run RoleEntryPoint方法退出时。这通常发生在您:

  1. 覆盖Run()方法和
  2. 程序代码中有未处理的异常会导致Run()方法退出
  3. 但是,当您启用IntelliTrace日志集合时,您的角色会回收,而是挂起。

    WebRole的默认模板不会覆盖Run()方法,因此保留默认实现,即" Thread.Sleep(-1);"。没有(自动)事件会导致WebRole的自动角色回收。除非您在RoleEntryPoint中执行某些操作,否则将导致Run方法退出。这种自动循环只发生在WorkerRole上,后者实现了Run()方法。

    更新1(根据评论1)

    run-Methoded of a RoleEntryPoint faces an error
    

    不仅是错误,而是这种错误(即未处理的异常),导致Run()方法退出。

    此外,您无法覆盖WebRole中的Run(),因为您的RoleEntryPoint后代存在于不同的应用程序域(甚至是不同的进程),然后是您的Web应用程序(因此它不知道您的应用程序&# 39;例外)。阅读有关完整IIS托管和处理here的更多信息。

    因此,对于Web角色,您只有一个完全支持IIS 7.0 / 7.5的Web应用程序,它不知道此IIS是Azure部署的一部分。 Global.asax是您管理ASP.NET中未处理的Web应用程序错误的地方。查看this question,其答案为Application_Error()处理程序提供了一个很好的示例。

    您可以使用RoleEnvironment类型的RequestRecycle静态方法在Application_Error()方法中手动要求角色回收。但是不建议你这样做。由于应用程序错误,我没有看到重新启动Web服务器的良好做法。您应该实现良好的异常处理和错误记录策略,定期检查错误日志并采取措施以避免需要重新启动服务器的严重错误。

    你的初衷是什么?要了解角色何时会自动回收,或者为应用程序建模,以便在出错时自动回收您的角色?如果是后者,我建议您修改业务要求/逻辑。

    更新2

    我无法通过Neil的口说话,但"实例失败"是一切可能导致正在运行的VM挂起的东西。 Windows Azure中的实例是一个签名虚拟机,用于托管应用程序的代码(有关托管服务,角色,实例的详细说明,请阅读this blog post)。您的应用程序在基于Windows Server的操作系统中运行。它是一个虚拟机。任何事情都可能发生 - 从主机上的硬件故障,到客户操作系统的通用软件/驱动程序故障。成为您的代码不是必需的。因此,万一发生会导致单个VM失败的问题 - Windows Azure Fabric会自动处理此问题。如果需要 - 您的代码会自动部署到另一个虚拟机。这种情况会自动发生。你没有。想象一下硬盘坏了,或者内存模块烧坏,或者网络接口停止响应 - 这些只是一些可能导致正在运行的VM失败的简单问题。这是一个实例失败。

    您应该注意代码中的失败。其他所有 - Windows Azure Fabric控制器负责。

    更新3

      
        
    1. 如果发生异常并且未处理,webrole中的asp.net应用程序会发生什么?该应用程序是否会挂起   未定义的状态("破坏"),直到我找到它或将它   由vm终止?
    2.   

    这个问题完全超出了范围!共享主机帐户中的asp.net应用程序会发生什么?或者在内部部署IIS安装?导致崩溃的用户的应用程序崩溃。最糟糕的应用程序池回收。我从来没有见过"挂" asp.net应用程序。没有"终止的asp.net应用程序"或者"破碎"。如果它是在应用程序启动或第一次请求期间引起的一般错误 - 应用程序永远不会在线。如果它是由某些用户操作序列引起的错误 - 用户将看到一个丑陋的错误消息而已(除非你在Global.asax中有适当的Application_Error()处理程序。我认为这对于一个无关的问题是足够的解释与Azure。

      
        
    1. 你能想到我的应用程序中的一段.NET代码可能会导致整个Web角色崩溃,或者它是不可能的   托管代码(除了.NET中的未知错误)?
    2.   

    你在开玩笑吧?此代码将导致您的Web角色崩溃,并将强制进行回收:

    RoleEnvironment.RequestRecycle()
    

    请接受这个问题,因为我不认为有什么遗漏。此外,它还有至少4个问题的答案,并添加到原始问题中。

    <强> FINAL

    没有&#34;永远杀死实例&#34;。