本文介绍的Web service monitor常常用于管理维护大中型web service。它一般具有以下功能:
- 周期性地访问web service,实时监控web service状态。
- 当web service发生异常时,立刻通知管理员。
- 当web service异常时,自动修复web service。一般重启service就能解决大部分问题。
- warm up web service,减少web service冷启动所带来的第一次访问响应时间长的问题。
下图是作者实际应用中开发使用的Monitor的结构。最底层是server cluster,各个server都在monitor的监视之下。如果某个server发生异常,monitor首先会试图通过重启来修复service。如果重启也不管用,那么就通知管理员。最后还得通过管理员来人工修复这个service。
我选择了使用状态机来实现这个monitor,service可以的状态大概有三种:
- 正常, 这状态下monitor只需周期性地检查service状态,捕获异常。我们也称其为Failure Detector状态
- 异常,这状态下monitor会试图修复service。我们也称其为Service Repairer状态
- 停止,service 的异常无法修复变进入这个状态。其实也是等待人工修复的状态,在这个状态下monitor依然周期性地检查service,看是否已经被人工修复。因而又称其为Recover Detector状态
下面看具体实现:
首先定义状态的接口,包含一个函数,它对应于状态转移的行为。
接下来是一个状态的具体例子。如前所述,这个状态负责检查web service运行情况,如果web service正常,那么它将进入_success状态,如果有异常将进入_failed状态。
看下状态转移函数的具体实现,_calls是用户自定义的检查函数,如果发现web service出问题了,它将抛一个异常处来。
根据前面的介绍,我们实现了剩下的状态类。例如:
有了这些状态,我们就可以来配置各种不同的状态机了。
例如我们定义一种检测web service,如果发现异常就发邮件通知用户的状态机。
我们也可以在NotifyWhenFailureFound这个状态机中添加修复一个状态,在它发现web service异常时,调用修复功能,例如:
最后,看看我们如果使用这些定义好的状态机吧。
其实就是在while{}中执行这些状态机。