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

.net Azure云实例在哪种类型的异常/崩溃之后执行重新启动?,.net,azure,cloud,paas,.net,Azure,Cloud,Paas,据我所知,角色实例应该在崩溃/失败后自动执行重新启动。 为了测试这种行为,我编写了一个应用程序,强制执行内存不足异常,我的应用程序崩溃了。角色实例没有执行重新启动,因为它仍在运行并且正常-该实例只是重新启动.NET运行时 我试图找出实例对不同错误的反应。在我的情况下,没有必要重启。什么类型的错误/异常(我可以强制执行)会导致实例完全重新启动?什么类型的错误/异常会永远杀死实例?导致角色实例被回收(重新启动)的唯一原因是方法退出时。这通常发生在以下情况: 重写()方法,并且 在程序代码中存在未处理

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


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

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

  • 重写()方法,并且
  • 在程序代码中存在未处理的异常,这将导致该方法退出
  • 但是,当您启用IntelliTrace日志收集时,您的角色将被回收,而不是挂起

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

    更新1(根据评论1)

    不仅仅是一个错误,还有这种错误(即未处理的异常),它会导致Run()方法退出

    此外,您不能只覆盖您的web角色中的Run(),因为您的RoleEntryPoint子代位于不同的应用程序域(甚至不同的进程)和您的web应用程序中(因此它将不知道您的应用程序的异常情况)。阅读有关完整IIS托管和进程的详细信息

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

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

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

    更新2

    我不能从Neil的口中说出来,但“实例失败”是导致运行中的VM挂起的一切因素。Windows Azure中的实例是承载应用程序代码的单一虚拟机(有关托管服务、角色、实例的详细说明,请参阅)。应用程序在基于Windows服务器的操作系统中运行。这是一个虚拟机。任何事情都可能发生——从主机上的硬件故障到来宾操作系统的通用软件/驱动程序故障。它不是必须成为你的代码。因此,如果发生可能导致单个VM失败的情况,此问题将由Windows Azure Fabric自动处理。如果有必要-您的代码将自动部署到另一个虚拟机。这是自动发生的。你什么都不做。想象一下,一个HDD坏了,或者一个内存模块烧坏了,或者一个网络接口停止响应——这些只是一些可能导致运行中的VM失败的简单问题。这是一个实例失败

    代码中的错误是您应该注意的。其他一切-Windows Azure结构控制器负责

    更新3

  • 如果发生异常且未处理,webrole中的asp.net应用程序会发生什么情况?应用程序是否会挂起 未定义状态(“断开”),直到我查找它或它将是 被虚拟机终止
  • 这个问题完全超出了范围!共享托管帐户中的asp.net应用程序会发生什么情况?还是在本地IIS安装中?其操作导致崩溃的用户的应用程序崩溃。最坏的情况是应用程序池回收。我从未见过“挂起”的asp.net应用程序。没有“已终止的asp.net应用程序”或“已损坏”之类的东西。如果是在应用程序启动或第一次请求期间导致的一般错误,则应用程序将永远不会联机。如果是由某个用户操作序列导致的错误-用户将看到一条丑陋的错误消息,除此之外什么都没有(除非您的Global.asax中有适当的应用程序\u error()处理程序。我认为这已经足够解释与Azure无关的问题了

  • 你能想到在我的应用程序中有一段.NET代码会导致整个web角色崩溃吗?或者这在我的应用程序中是不可能的 托管代码(除了.NET中的未知错误)
  • 你在开玩笑吗?此代码将使你的web角色崩溃并强制回收:

    RoleEnvironment.RequestRecycle()
    
    请接受这个问题,因为我不认为有什么遗漏。加上它有至少4个问题的答案,添加到原来的一个

    决赛


    没有“永远杀死实例”这样的事情.

    谢谢。我在理解这一点时有点问题。根据您的说法,只有当RoleEntryPoint的运行方法遇到错误时,才会自动循环和重新启动。这是否意味着在web角色上运行的普通ASP.NET应用程序没有机会自动重新启动
    RoleEnvironment.RequestRecycle()