据我所记得的,角色实例应在崩溃/失败后自动执行重新启动。为了测试该行为,我编写了一项应用程序,该应用程序可以执行无内存的外观,并且我的应用程序崩溃了。角色实例没有执行重新启动,因为它仍在运行,还可以 - 该实例仅重新启动.NET运行时。

我正在尝试找出实例对不同错误的反应。就我而言,不需要重新启动。什么类型的错误/异常(我可以执行)会导致实例的完整重新启动?什么类型的错误/异常将永远杀死一个实例?

有帮助吗?

解决方案

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

  1. 覆盖 ()方法,和
  2. 在您的程序代码中有一个未经治疗的例外,这将导致 跑() 退出方法

但是,当您启用IntelliTrace Logs Collection时,您的角色会回收,而是悬挂。

Webrole的默认模板不会覆盖 跑() 方法,因此留下默认实现,即“ thread.sleep(-1);”。没有(自动)事件会导致Webrole的自动角色回收。除非您在Roalentrypoint中做某事,否则会导致运行方法退出。这种自动回收仅发生在workerrole时,它确实实现了Run()方法。

更新1(注释1)

run-Methoded of a RoleEntryPoint faces an error

不仅是一个错误,而且是这样的错误(即未经治疗的异常),这会导致Run()方法退出。

此外,您不能仅仅覆盖Webrole中的Run(),因为您的WoyEntrypoint Descendat居住在不同的应用程序域(甚至是不同的过程),而不是您的Web应用程序(因此它对您的应用程序的例外不了解)。阅读有关完整IIS托管和流程的更多信息 这里.

因此,对于Web角色,您只需在完全功能IIS 7.0 / 7.5中拥有一个Web应用程序,该应用程序不知道该IIS是Azure部署的一部分。 global.asax是您在ASP.NET中管理未经处理的Web应用程序错误的地方。查看 这个问题, ,其答案为Application_error()处理程序提供了一个很好的示例。

您可以使用 requestRecycle Roleenvironment类型的静态方法需要手动需要在您的application_error()方法中进行角色回收。但是,不建议您这样做。由于应用程序错误,我看不到重新启动Web服务器的好习惯。您应该实施良好的异常处理和错误记录策略,监管检查您的错误日志,并采取措施以避免需要服务器重新启动的哭泣错误。

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

更新2

我不能从尼尔的嘴里说话,但是“实例失败”是可能导致运行VM吊死的一切。 Windows Azure中的实例是托管您应用程序代码的招标虚拟机(阅读 这篇博客文章 有关托管服务的详细说明,角色,实例)。您的应用程序在基于Windows服务器的OS中运行。这是一台虚拟机。任何事情都可能发生 - 从主机上的硬件故障到来宾操作系统的通用软件/驱动程序故障。成为您的代码不是必要的。因此,如果发生某些事情会导致单个VM失败 - 此问题将由Windows Azure Fabric自动处理。如果它是必要的 - 您的代码会自动部署到另一台虚拟机上。这是自动发生的。你没事。想象一下HDD断裂,或者一个内存模块会燃烧,或者网络接口停止响应 - 这些只是一些简单的问题,可能会导致运行的VM失败。这是实例失败。

您应该照顾代码中的故障。其他一切 - Windows Azure Fabric Controller需要处理。

更新3

  1. 如果发生异常并且没有处理,则在Webrole中的ASP.NET应用程序会发生什么?该应用程序是否会悬挂在未定义的状态(“破碎”)之前,直到我寻找它,还是会被VM终止?

这个问题完全超出了范围!共享托管帐户中的ASP.NET应用程序会发生什么?还是在本地IIS安装中?申请崩溃,该用户的操作导致崩溃。最坏的情况应用程序池回收。我从未见过“悬挂” ASP.NET应用程序。没有“终止ASP.NET应用程序”或“破碎”之类的东西。如果是在应用程序启动或第一个请求期间引起的通用错误,则该应用程序将永远不会在线。如果这是由某些用户操作序列引起的错误 - 用户将看到一条丑陋的错误消息(除非您在global.asax中都有适当的application_error()处理程序。我认为这足以解释一个问题用azure。

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

你在开玩笑吗?该代码将使您的网络角色崩溃,并将迫使回收:

RoleEnvironment.RequestRecycle()

请接受这个问题,因为我认为没有缺少的东西。另外,它具有至少4个问题的答案,并添加到原始问题中。

最后

没有“永远杀死实例”之类的东西。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top