首页 > 代码库 > Windows Azure Cloud Service (10) Role的生命周期

Windows Azure Cloud Service (10) Role的生命周期

  《Windows Azure Platform 系列文章目录》

 

  在上一章内容中,我们提到了Windows Azure会依次调用角色(Role)实例的OnStart()方法和Run()方法。

  在本节中我们会对Role的生存周期进行进一步的了解。首先,让我们走到幕后看看一个Role Instance是怎么被发布到虚拟机上并启动起来的。

  

  Role在虚拟机上部署和运行的过程

  以下是角色实例(Role Instance)发布和启动的一个简要过程。

  1. Windows Azure在服务器池中选择一个有足够CPU内核数的宿主服务器,或者启动一个新的满足需求的宿主服务器
  2. Windows Azure将云服务包和配置文件复制到宿主服务器上。宿主服务器上的一个宿主代理程序(Host Agent)会启动虚拟操作系统。
  3. 在虚拟操作系统上有一个名为WaAppAgent的代理程序。这个代理程序负责配置虚拟操作系统并启动一个名为WaHostBootstrapper的进程。
  4. 如果角色上定义了启动任务,WaHostBootstrapper会运行这些启动任务并等待所有标记为Simple类型的启动任务正确执行
  5. 如果角色是Web 角色(Web Role),WaHostBootstrapper会启动IISConfigurator来配置IIS
  6. 如果角色是辅助角色,WaHostBootstrapper启动一个名为WaWorkerHost的进程;如果角色是Web角色,WaHostBootstrapper启动一个名为WaIISHost的进程
  7. 在上述进程中,载入角色的程序集并搜索其实施的RoleEntryPoint子类
  8. 调用OnStart()方法
  9. 调用Run()方法。同时,该实例被标记为"Ready"并加入负载平衡器
  10. 如果Run()方法退出,OnStop()方法被调用。WaWorkerHost/WaIISHost结束运行,实例重启
  11. WaHostBootstrapper开始循环监测实例的运行状态

  Web Role不一定需要实施RoleEntryPoint类,这是因为Web Role最终是部署在IIS上,是IIS在接受和转发用户的请求。

  这也是为什么我们如果把WebRole.cs从web项目中删除不会影响到网站运行的原因。

  但是,如果您的Web Role实施了RoleEntryPoint类,您要确保Run()方法不退出,否则实例会重启。

 

  

  角色实例(Role Instance)的状态

  Role Instance可以处于不同的状态:Busy 或者 Ready。

  只有在Role处于Ready状态时,才参与负载平衡任务的分配。

  如果您想在代码中临时改变Role Instance的状态,可以响应RoleEnvironment类所定义的StatusCheck(状态检查)事件,并且通过事件参数中RoleInstanceStatusCheckEventArgs的Setbusy()方法将实例标记为Busy。这样,负载均衡器就不会把任务分配到当前实例,直至下一次WaHostBootstrapper对实例状态进行检查。

  如果在运行过程中您的Role Instance代码退出了Run()方法,或者抛出了未处理的异常(Unhandledexceptions),WaHostBootstrapper会重新启动您的Role Instance。这种自动恢复的机制能够帮助提高系统的可用性。当然,在重新启动的过程中,这个实例在非Ready状态下是不能接受用户请求的。如果WaHostBootstrapper自身奔溃了或者虚拟机宕机了,Windows Azure会重启虚拟机以及Role Instance。如果宿主服务器宕机了,Windows Azure在若干恢复重试后将Role Instance重新部署到一台健康的服务器上。

  在Windows Azure关闭Role Instance的过程中,会触发Stopping事件,并调用Role的OnStop()方法。您可以在这里实现实例关闭过程中需要进行的处理,例如释放Role使用的资源等。

  最后,如果想强制重新启动您的实例,可以用RoleEnvironment.RequestRecycle()方法来通知Windows Azure进行实例的重新启动。

 

 

  

Windows Azure Cloud Service (10) Role的生命周期