第三章 设计程序架构 之 设计实现Windows Azure 角色生命周期

1. 概述

  Windows Azure 是微软的云计算平台。用于 在微软数据中心 通过全局网络 生成、发布和管理应用程序。

  本章内容包括 startup tasks 以及  实现 Start, Run 和 Stop 事件。

2. 主要内容

  2.1 Windows Azure

    ① 提供 PaaS 和 IaaS 两种服务。

    PaaS 提供一个实际的计算平台,包括 操作系统、程序执行环境、数据库 和 web服务器。

    IaaS 是提供虚拟的机器。

    ② Windows Azure 有三种类型的解决方案:虚拟机器、web站点 和 云服务。

    虚拟机器:使用方式类似本地的机器,可以进行开发测试和部署。

    web站点:单纯的web站点寄宿。可以方便的部署和运行ASP.NET MVC4站点。

    云服务:直接的PaaS模式,是Windows Azure的初始发布模型。

  2.2 Startup tasks

    2.2.1 Windows Azure中有三种角色:Web、Worker 和 VM。

      Web一般用于执行IIS。Worker一般用于执行中间层的程序。而VM角色可以完全的访问虚拟机。

    2.2.2 通过 Startup tasks,可以 注册COM组件、安装组件或者设置注册key。Startup tasks仅对Web和Worker角色可用。

      Startup tasks 在 Task元素中定义,Task元素是 ServiceDefinition.csdef文件中的Startup元素的一个节点。

      一个标准的Startup tasks是一个命令行程序或者一个批处理文件。

    2.2.3 当一个角色启动,Windows Azure中,后续的过程如下:

      ① 实例被标记为Starting,不再接收通知。

      ② Startup tasks 根据taskType属性开始执行。。(简单任务以同步方式,后台和前台任务以异步方式。)

      ③ 角色寄宿过程启动,站点在iis中被创建。

      ④ 调用 Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart 方法。

      ⑤ 实例被标记为Reader并开始接收通知。

      ⑥ 调用  Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.Run 方法。

    2.2.4  AppCmd.exe命令行工具用于在Windows Azure中,启动时管理IIS设置。

    2.2.5 Startup tasks 可以被执行多次。忘记配置AppCmd.exe工具会导致运行时错误。

    2.2.6 可以把一个任务标记为后台执行。

<Startup> 
    <Task commandLine="StartupExecWithRetries.exe  
              &quot;/c:StartupAzureEnableWarmup.cmd&quot;  
              /d:5000 /r:20 /rd:5000 &gt;&gt; c:enablewarmup.cmd.log 
              2&gt;&gt;&amp;1" 
          executionContext="elevated" taskType="background" /> 
</Startup>

    2.2.7 Windows Azure 虚拟机是无状态的。

  2.3 实现  Start, Run 和 Stop 事件

     OnStart 方法和 Startup tasks有许多概念上的相似点:

    ① 有相同的超时机制。

    ② 角色被回收时都会被再次执行。

    ③ 都可以配置先于角色处理。

     OnStart 方法和 Startup tasks 的不同之处包括:

    ① Startup tasks 运行在不同的进程中。适用于需要独立运行过程的软件和平台。

    ② 状态信息可以在OnStart方法和Run方法中共享,因为这两个方法在同一个应用程序域中。

    ③ Startup tasks可以被配置为后台或者前台任务,并且可以并发运行。

    当所有配置好的Startup tasks完成后,Window Azure角色开始运行。有三个主要的事件可以重写:OnStart、Run、OnEnd。

public class WorkerRole : RoleEntryPoint 
{ 
    public override bool OnStart() 
    {  
       try 
       { 
          // Add initialization code here 
       }  
       catch (Exception e)  
       { 
          Trace.WriteLine("Exception during OnStart: " + e.ToString()); 
          // Take other action as needed.  
       }  
       return base.OnStart(); 
    } 
}
public override void Run() 
{ 
    try 
    { 
       Trace.WriteLine("WorkerRole entrypoint called", "Information"); 
       while (true)  
       { 
          Thread.Sleep(10000);  
          Trace.WriteLine("Working", "Information"); 
       } 
       // Add code here that runs in the role instance 
    } 
    catch (Exception e)  
    { 
       Trace.WriteLine("Exception during Run: " + e.ToString()); 
       // Take other action as needed.  
    } 
}
public override void OnStop() 
{  
    try 
    { 
       // Add code here that runs when the role instance is to be stopped 
    }  
    catch (Exception e)  
    { 
       Trace.WriteLine("Exception during OnStop: " + e.ToString()); 
       // Take other action as needed.  
    } 
}

    OnStop方法有5分钟强制限制。确保程序被彻底的清理。

3. 总结

  ① Windows Azure 是一个基于云的,给公司和开发者提供高度可配置、灵活部署的服务环境。

  ② Azure是无状态的。每次运行之间的数据不能被保存和共享。

  ③ 开发者可以给一个角色一系列Startup tasks去运行。这些Startup tasks可以实现 安装附加软件和第三方工具,修改注册信息以及满足Asp.Net MVC程序的其他需求。 可以使用AppCmd.exe工具去管理这些Startup tasks。

  ④ Startup tasks完成后,OnStart方法就会被调用。可以重载OnStart方法去实现其他功能。记得要返回true,否则将启动失败。

  ⑤ OnStart方法返回后(返回true),Run方法就会被调用。Run方法是void方法,可以重载它和主程序并发执行。

  ⑥ 程序结束前,会调用OnStop方法。这个方法也是一个void方法。用于清理前面两个方法的资源。

原文地址:https://www.cnblogs.com/stone_lv/p/4602938.html