第一弹的后端有很多很多个实例来提供服务,使用了Ucloud提供的ULB负载均衡器来对外接收请求,之前在重启后端服务程序的时候,往往要进控制台在ULB里把对应的服务给禁用了,然后重启完再启用,如果有很多台机器的话,要一个个操作,非常非常的麻烦。

最近想到,能不能用ULB的状态检查功能来自动禁用对应的服务,这样服务重启以后也会自动的恢复,免去人工操作的步骤。

ULB支持两种状态检查方法:端口检查和HTTP检查。

QQ20160522-0

端口检查就是ULB会去ping后端服务的端口,如果端口联通就判定为可用,否则判定后端服务不可用,但是这么做有个延迟,ULB是两秒检查一次,如果三次检查发现有问题才会切换,这样就会有6秒的时间,后端服务已经关闭了,但是ULB依然会把连接发过去,会造成很多用户连接失败。

HTTP检查好像是最近加的功能,通过一个HTTP请求来判断,如果返回200,说明服务可用,其他返回值说明服务不可用,这个方法可以很方便的使用,后端程序提供一个URL来进行检查,正常情况下,这个URL返回的是200,当需要重启的时候,先把该URL的返回值设置为其他值,比如404,然后等若干秒以后,ULB把流量切换走了,再关闭端口,进行重启的步骤,这样有效的避免了在重启过程中用户无法连接的问题。

以下是我们的tornado相关代码

class HealthHandler(tornado.web.RequestHandler):
    def head(self):
        if not Global.is_in_stop:
            self.write('')
        else:
            raise tornado.web.HTTPError(404)

如此一来,每次部署程序的时候只要挨个重启后端服务就行了,不需要登录控制台操作ULB了。