正确处理 Azure OnStop 事件

作者信息: 本篇文章是由Windows Azure 和 ASP.NET MVC组程序员/作家Rick Anderson所著。

重启Web Roles

如何重启是Windows Azure 中一个经常被忽视的问题。正确处理重启操作至关重要,这样您就不至于丢失数据或损坏您固有的数据,便于您快速关机、 重启和高效率地处理新的请求。Windows Azure Cloud Service每月大约重启两次用于更新操作系统。 (关于操作系统更新的详细,请参阅Role Instance Restarts Due to OS Upgrades。)当一个页面应用程序关闭时,将触发RoleEnvironment.Stopping事件。因为由 Visual Studio 创建的 web role boilerplate不会去重写OnStop方法,所以应用程序在关机前只有几秒钟时间来处理 HTTP 请求。如果您的 web role正忙着处理挂起的请求,有些请求就有可能会丢失。你可以延迟重启时间或让您的 web role推迟最多 5 分钟的时间来重写OnStop方法和调用Sleep,但这并不是很理想。一旦引发Stopping事件,Load Balance(LB)就停止向web role发送请求,所以拖延关机时间长于处理挂起请求让您的虚拟机处于Sleep状态的时间,并不起什么作用。最佳的方法是等待OnStop方法直到没有更多的请求,然后启动关机。关的越早,VM 重启并开始处理请求就越早。要想使用最佳方法关机,请将下面的代码添加到WebRole类中。

上面的代码检查 ASP.NET 请求的当前的counter。只要有请求,该OnStop方法将调用Sleep延迟关机。一旦当前请求的counter降为零, OnStop返回并启动关机。万一  web 服务器太忙而不能在 5 分钟内处理完挂起的请求,应用程序也会强行关闭。请记住一旦触发Stopping事件,LB 会停止将请求发送到 web role,所以除非您拥有大量的web role (或太少的实例),否则永远不要超过几秒钟来完成当前请求。

上面的代码为Trace写入数据,但除非您执行一个复杂的On-Demand Transfer,不然 OnStop方法的trace数据将永远不会出现在WADLogsTable上。后面,我将介绍如何使用DebugView来查看这些trace事件。以及如何在web role 的OnStart方法中获取tracing working。

Worker Roles的最佳重启方法

在一个worker role中处理Stopping事件需要不同的办法。通常worker role在Run方法中处理队列消息。该方法包括两个全局变量 ;一个通知Run方法Stopping事件已触发,另一个通知OnStop方法可以安全地启动关机。(OnStop返回后启动关机)。下面的代码演示了这两种全局方法。

OnStop调用时,全局变量onStopCalled设置为 true,若没有队列事件需要处理,在Run方法中就可以根据onStopCalled的值在第一层循环时判断是否关机。

查看 OnStop Trace Data

如前面所提到的,除非您执行一个复杂的On-Demand Transfer,不然 OnStop方法的trace数据将永远不会出现在WADLogsTable上。我们将使用Dbgview来查看这些trace事件。在Solution Explorer中,右键单击云项目并选择Publish.

下载您的发布配置文件。在Publish Windows Azure Application对话框中,选择Debug并勾选Enable Remote Desktop for all roles

编译器会将Trace调用从发布版本中移除,所以您需要设置build configuration为Debug来查看Trace数据。一旦应用程序发布并运行,在 Visual Studio 中,选择Server Explorer (Ctl + Alt + S)。选择Windows Azure Compute,然后选择您的云部署。(此项目中叫做t6,它是一个production部署)。选择 web role instance,单击鼠标右键,选择Connect using Remote Desktop.

Remote Desktop Connection (RDC)将使用您在发布向导中指定的帐户名称,并提示您输入密码。在任务栏的左侧,选择Server Manager图标。

Server Manager左选项卡,选择Local Server,然后选择IE Enhanced Security Configuration (IE ESC)。在IE ESC 对话框中选择关闭radio按钮。

启动Internet Explorer、 下载和安装DebugView。启动DebugView,并在Capture菜单中,选择Capture Global Win32

选择filter图标,,然后输入下面的排除筛选器:

对于此测试,我在About操作方法中添加了RoleEnvironment.RequestRecycle方法,正如其名字所示,启动关机/重启序列。或者,您可以重新发布应用程序,还将启动关机/重启序列。

按照同样的操作也可以查看worker role VM中的trace data。选择worker role instance,用鼠标右键单击并选择Connect using Remote Desktop

如果您想看到一篇这样的博客,是关于如何让获取trace数据出现在WADLogsTable上而不是用OnStop方法,请联系我。本篇的大部分内容来自于我和Tom上周发布的Azure multi-tier tutorial。您一定在此篇文章中也看到了一些其他好的方法。

— —Rick

@RickAndMSFT

Reference: https://blogs.msdn.com/b/windowsazure/archive/2013/01/14/the-right-way-to-handle-azure-onstop-events.aspx