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

cer*_*ran 7 .net cloud azure paas

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

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

ast*_*kov 12

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

  1. 覆盖Run()方法,和
  2. 在程序代码中有一个未处理的异常,这会导致Run()方法退出

但是,当您启用IntelliTrace日志集合时,您的角色将会回收,而是挂起.

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

更新1(根据评论1)

run-Methoded of a RoleEntryPoint faces an error
Run Code Online (Sandbox Code Playgroud)

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

此外,您不能只覆盖WebRole中的Run(),因为您的RoleEntryPoint后代存在于不同的应用程序域(甚至是不同的进程),然后是您的Web应用程序(因此它不知道您的应用程序的异常).了解更多关于全面IIS托管和过程在这里.

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

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

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

更新2

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

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

更新3

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

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

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

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

RoleEnvironment.RequestRecycle()
Run Code Online (Sandbox Code Playgroud)

请接受这个问题,因为我认为没有遗漏的东西.此外,它还有至少4个问题的答案,添加到原始问题中.

最后

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