|
|
51CTO旗下网站
|
|
移动端

2.3.5.2 服务生命周期概述

《Microsoft Azure 管理与开发(下册)平台服务PaaS》本书由世纪互联蓝云Microsoft Azure 开发技术支持团队的资深工程师们编写,主要阐述MicrosoftAzure PaaS 服务的开发应用,涉及计算服务、集成认证服务、数据存储服务、大数据服务等方面的内容。本节为服务生命周期概述。

作者:世纪互联蓝云公司来源:电子工业出版社|2018-07-12 17:46

2.3.5.2 服务生命周期概述

在详细介绍Reliable Service 使用之前,必须先了解Reliable Service 生命周期的基础知识。Reliable Service 的生命周期很简单,Reliable Services 在接口中定义了两个方法,具体的服务只要按照自己的业务来实现接口内容,就可以实现一个简单的Reliable Service。一般来说,服务的生命周期及其简要处理过程如下。

(1) 启动服务。

a) 构造服务;

b) 服务可能会构造多个侦听器,也可能不包含侦听器;

c) 启动所有的侦听器,以便与服务通信;

d) 调用服务的RunAsync 方法,使服务能够长期保持工作状态。

(2) 关闭服务。

a) 传递取消标记状态RunAsync 方法的参数,同时关闭所有侦听器;

b) 完成该过程后,销毁服务,并清理占用资源。

事件的顺序可能会根据Reliable Service 是无状态服务还是有状态服务而略有变化。对于有状态服务,还必须要处理主副本的交换策略,下面会详细介绍。

1. 无状态服务的生命周期

无状态服务的生命周期,跟上面介绍的事件顺序一样。

无状态服务的启动如下。

(1) 构造服务,实现服务构造函数。

(2) 然后会并行执行两个方法。

a) 调用 StatelessService.CreateServiceInstanceListeners(),打开返回所有的侦听器;

b) 调用服务的RunAsync 方法,保持服务一直处于工作状态。

(3) 之后调用服务的OnOpenAsync 方法(如果存在,这个方法一般不常用)。

这里需要注意,启动服务侦听和执行RunAsync 之前是没有前后顺序的,两者是同时执行的,如果希望它们能够按照同步的方式来执行,可以使用标记的方法,来协调两者的执行,例如:如果希望RunAsync 方法在创建侦听器成功之后执行,可以在构造侦听器的过程中使用一个标记来标示构造侦听器工作结束,然后再执行其他操作。

无状态服务的关闭过程,也遵循相同的模式,只不过顺序是相反的。顺序如下。

(1) 并行运行这两个方法。

(2) 关闭所有已打开的侦听器,调用ICommunicationListener.CloseAsync()。

(3) 传递取消标记给RunAsync(),停止执行该过程。

(4) 当执行完以上步骤后,调用服务的OnChangeRoleAsync(),该方法不常用。

(5) 完成StatelessService.OnCloseAsync()方法后,销毁服务对象,释放资源。

无状态服务的生命周期较为简单,因为无状态服务不会在服务内保留状态,不过以往开发的大多数服务并不是真正的无状态服务,它们只是将状态存储到其他外部存储器中,Service Fabric 无状态服务常被用来实现面向公众的Web API,然后该API 指向有状态服务来完成用户的请求。

2. 有状态服务的生命周期

有状态服务的启动,与无状态类似,但也稍有不同,启动服务的顺序如下:

(1) 构造服务;

(2) 调用服务的OnOpenAsync 方法(如果存在,这个方法一般不常用);

(3) 如果是主副本,则并行执行以下两个方法,否则跳过该步骤;

(4) 调用StatefulService.CreateServiceReplicaListeners(),打开返回所有的侦听器;

(5) 调用服务的RunAsync 方法,并保持服务一直处于工作状态;

(6) 当打开所有侦听器和执行RunAsync 后,调用StatefulServiceBase. OnChangeRoleAsync()方法(该方法一般并不常用)。

类似于无状态服务,打开侦听器和RunAsync 方法是并行执行的。如果想要同步执行,解决办法跟无状态服务类似。另外有一种情况,假设通信侦听器需要调用某个ReliableCollections 中保存的信息才能正常工作,由于通信侦听器可能会在Reliable Collections 可读或者可写之前打开,因此就需要在RunAsync 启动之前,设置一定的协调规则。例如使用标记或者让通知侦听器返回某个错误代码,以便让客户端重试。

有状态服务的关闭,类似于关闭无状态服务,关闭有状态服务期间的事件与启动期间是相同的,只不过顺序是相反的。启动顺序如下:

(1) 并行关闭所有侦听器和结束RunAsync 方法;

(2) 调用ICommunicationListener.CloseAsync()关闭所有已打开的侦听器;

(3) 传递取消标记给RunAsync(),停止执行该过程;

(4) 当执行完以上步骤后,调用服务的OnChangeRoleAsync(),该方法不常用;

(5) 调用完OnChangeRoleAsync(),之后再调用OnCloseAsync()方法,此方法也不常用;

(6) 完成以上步骤后,销毁服务对象,释放资源。

3. 有状态服务的主副副本交换

有状态服务在Service Fabric 是运行设置多个副本的,例如设置3 个副本,则ServiceFabric 会为该服务的每个分区生成3 个程序和数据副本,一个是主副本,另外两个是辅助副本。当主副本出现问题或者服务升级时,就会从另外两个辅助副本中选择一个升级为主副本,将当前副本降级为辅助副本。这样Service Fabric 也提高了应用服务的高可用性。这里有一点需要注意,只有主副本打开通信侦听器和执行RunAsync,所以在切换需要升级为的副本需要开启服务和执行RunAsync,而需要降级的主副本,则需要关闭侦听器和停止执行RunAsync。

降级的主副本流程如下:

(1) 并行关闭通信侦听器和RunAsync;

(2) 调用ICommunicationListener.CloseAsync()关闭所有已打开的侦听器;

(3) 传递取消标记给RunAsync(),停止执行该过程;

(4) 当执行完以上步骤后,调用服务的OnChangeRoleAsync(),该方法不常用。

升级的辅助副本流程如下:

(1) 并行执行以下两个方法,否则跳过该步骤;

(2) 调用StatefulService.CreateServiceReplicaListeners(),打开返回所有的侦听器;

(3) 调用服务的RunAsync 方法,并保持服务一直处于工作状态;

(4) 当执行完以上步骤后,调用服务的OnChangeRoleAsync(),该方法不常用。

4. 服务生命周期注意事项

在开发Reliable Service 时需要注意,RunAsync 和启动通信侦听器的方法的调用是可选的,可以只实现一个,也可以都实现,这要根据业务进行选择。如果只是响应用户请求,可以不实现RunAsync,只需要提供通信侦听相关代码;如果服务只是后台执行,不对用户请求提供相应,则可以只是实现RunAsync。另外注意以下几点事项。

(1) 服务成功完成RunAsync 并从中返回即可,这不会被认为是一种错误状态,这只是表示该服务对应的后台任务正在完成。对于有状态Reliable Services,如果服务已从主副本降级,然后重新升级到主副本,会再次调用RunAsync。

(2) 如果服务发生异常退出RunAsync,这种情况属于一种异常状态,在此情况下,Service Fabric 会关闭服务对象并报告运行状况错误。

(3) 当RunAsync 方法收到取消请求后,如果没有在规定时间内结束返回,(默认是15 分钟),Service Fabric 会强制关闭终止服务,通常这种情况发生在升级和删除服务时。(4) 有状态服务针对ServiceReplicaListeners 提供了一个附加选项,使得一些通信侦听器可以在辅助副本上启动,这种情况不太经常使用。

(5) 当关闭时,会调用OnCloseAsync,一般会在此方法中,尽量释放服务占用的资源。但是有时会出现失败的情况,这时Service Fabric 会调用OnAbort()方法,所以,也需要在此方法中,加入释放服务占用的资源的方法。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

数据库系统工程师考试全程指导

为了满足广大考生的需要,我们组织了参与过多年资格考试命题或辅导的教师,以新的考试大纲为依据,编写了《数据库系统工程师考试全程指导》...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊