Windows Azure Cloud Service (10) Role的生命周期
《Windows Azure Platform 系列文章目录》
在上一章内容中,我们提到了Windows Azure会依次调用角色(Role)实例的OnStart()方法和Run()方法。
在本节中我们会对Role的生存周期进行进一步的了解。首先,让我们走到幕后看看一个Role Instance是怎么被发布到虚拟机上并启动起来的。
Role在虚拟机上部署和运行的过程
以下是角色实例(Role Instance)发布和启动的一个简要过程。
- Windows Azure在服务器池中选择一个有足够CPU内核数的宿主服务器,或者启动一个新的满足需求的宿主服务器
- Windows Azure将云服务包和配置文件复制到宿主服务器上。宿主服务器上的一个宿主代理程序(Host Agent)会启动虚拟操作系统。
- 在虚拟操作系统上有一个名为WaAppAgent的代理程序。这个代理程序负责配置虚拟操作系统并启动一个名为WaHostBootstrapper的进程。
- 如果角色上定义了启动任务,WaHostBootstrapper会运行这些启动任务并等待所有标记为Simple类型的启动任务正确执行
- 如果角色是Web 角色(Web Role),WaHostBootstrapper会启动IISConfigurator来配置IIS
- 如果角色是辅助角色,WaHostBootstrapper启动一个名为WaWorkerHost的进程;如果角色是Web角色,WaHostBootstrapper启动一个名为WaIISHost的进程
- 在上述进程中,载入角色的程序集并搜索其实施的RoleEntryPoint子类
- 调用OnStart()方法
- 调用Run()方法。同时,该实例被标记为"Ready"并加入负载平衡器
- 如果Run()方法退出,OnStop()方法被调用。WaWorkerHost/WaIISHost结束运行,实例重启
- 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的生命周期的更多相关文章
- Windows Azure Cloud Service (11) PaaS之Web Role, Worker Role(上)
<Windows Azure Platform 系列文章目录> 本文是对Windows Azure Platform (六) Windows Azure应用程序运行环境内容的补充. 我们知 ...
- Windows Azure Cloud Service (42) 使用Azure In-Role Cache缓存(1)Co-located Role
<Windows Azure Platform 系列文章目录> Update 2016-01-12 https://azure.microsoft.com/zh-cn/documentat ...
- Windows Azure Cloud Service (43) 使用Azure In-Role Cache缓存(2)Dedicated Role
<Windows Azure Platform 系列文章目录> Update 2016-01-12 https://azure.microsoft.com/zh-cn/documentat ...
- Windows Azure Cloud Service (36) 在Azure Cloud Service配置SSL证书
<Windows Azure Platform 系列文章目录> 在某些时候,我们需要在Azure PaaS Cloud Service配置HTTPS连接.本章将介绍如何在本地创建证书,然后 ...
- Windows Azure Cloud Service (39) 如何将现有Web应用迁移到Azure PaaS平台
<Windows Azure Platform 系列文章目录> 本文将简单介绍,如何将企业内现有的ASP.NET应用程序迁移到Azure PaaS平台. 因为在迁移过程中,可能需要对现有的 ...
- Windows Azure Cloud Service (47) 修改Cloud Service时区
<Windows Azure Platform 系列文章目录> 本文介绍内容适合于Azure Global和Azure China 我们在使用Cloud Service的时候,会发现默认的 ...
- Windows Azure Cloud Service (38) 微软IaaS与PaaS比较
<Windows Azure Platform 系列文章目录> 最近一直想总结Azure IaaS和PaaS的区别与比较,写个博文详细说明一下.建议读者在阅读之前,先熟悉微软PaaS和Ia ...
- Windows Azure Cloud Service (12) PaaS之Web Role, Worker Role, Azure Storage Queue(下)
<Windows Azure Platform 系列文章目录> 本章DEMO部分源代码,请在这里下载. 在上一章中,笔者介绍了我们可以使用Azure PaaS的Web Role和Worke ...
- [SDK2.2]Windows Azure Cloud Service (35) 使用VS2013发布Azure Cloud Service
<Windows Azure Platform 系列文章目录> 好久没有更新BLOG了,今天我们继续Windows Azure相关的内容. 笔者最近把Visual Studio升级到了20 ...
随机推荐
- 二进制求最大公约数&&输出二进制
Divided Land Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tot ...
- MySQL 升级详细步骤 (包括 Percona)
MySQL 升级步骤 MySQL 5.1.72 升级到 MySQL 5.5.36 鉴于我在升级的时候遇到的麻烦问题,我觉得有必要把一些细节说清楚,免得引起误解了.感觉官方文档上的升级步骤写的比较简单, ...
- 《与mysql零距离接触》视屏学习笔记
1.数据表的增删改查操作(crud): 对于表: 增:create table XXXX 删:drop table XXXX 改:alter table XXXX rename to XXXX 查 ...
- Blend 2015 教程 (二) 样式
前一篇讲述了如何在新Blend中完成一个简单的带数据绑定的界面小例子,本篇将讲述一下,把View层和Style层分开,并搭建Style层框架的方法,并进行细节样式修改. 1. 在解决方案资源管理器面板 ...
- nginx(3、负载均衡)
当业务系统需要配置集群时,会用到nginx的负载均衡功能.nginx提供如下几种: 1.轮询(默认):将不同的请求随机分配给配置的服务器,若出现宕机,则自动切换:轮询可配置weight值,即权重,权重 ...
- Lock-Free 编程
文章索引 Lock-Free 编程是什么? Lock-Free 编程技术 读改写原子操作(Atomic Read-Modify-Write Operations) Compare-And-Swap 循 ...
- C#将dll打包到程序中
最近比较懒,加上内容也不多就懒得排版了,字放大了,看起来应该方便一点 直接进入主题 先来看一个栗子,假设现在有一个第三方dll namespace TestLibrary1 { public clas ...
- NanoProfiler - 适合生产环境的性能监控类库 之 大数据篇
上期回顾 上一期:NanoProfiler - 适合生产环境的性能监控类库 之 基本功能篇 上次介绍了NanoProfiler的基本功能,提到,NanoProfiler实现了MiniProfiler欠 ...
- C++虚函数表
大家知道虚函数是通过一张虚函数表来实现的.在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承.覆盖的问题,其内容真是反应实际的函数.这样,在有虚函数的类的实例中,这个表分配在了这个实例的内存中 ...
- 每天一个linux命令(54):ping命令
Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地址192.168.1.1试试”. ...