关于对容错的一点想法

    最近收到一个任务,有N个数据,然后通过一个第三方的Web API对数据进行处理,并记录下处理的结果。初想起来,这个感觉很容易就能解决,比如用python写一个脚本,通过httplib库调用第三方的Web API,然后获取结果并记录。代码可能看起来像这样:
1def getAPIResult(somedata):
2    conn = httplib.HTTPConnection('www.host.com')
3    conn.request('GET''/path/?arg1=' + somedata + '&arg2=value2')
4    resp = conn.getresponse()
5    data = resp.read()
6    conn.close()
7    return processResultData(data)
    现在的网络质量已经很好了,不过对于网络来说,发生超时错误或者是因为某种特殊原因而导致的请求失败还是有发生的可能的。因此,如果直接调用上面的getAPIResult函数其本身是不负责任的。也许你的程序会因为网络超时而崩溃。
    对于很少的数据量来说,我们可以忽略网络质量问题所导致的错误,但是当N非常大的时候呢?如果一个程序,跑了一段时间,结果在最后一秒钟因为网络问题崩溃了,你是什么心情?关于处理网络质量问题的解决方法很简单,就是重试。想想看,平时某个页面第一次打不开,你会做什么?单击刷新按钮吧?(这里不考虑你不想看这个页面的情况)如果刷新了好几次都没能打开,你可能就离开这个页面了——因为这个页面根本没法看。
    把上面的情况放在程序里,代码多半会看起来像这样:
1def getAPIResultWithRetry(somedata):
2    for i in range(5):
3        try:
4            return getAPIResult(somedata)
5        except:
6            print "retry"
7    #The service must crashed!
    这里用了上面的getAPIResult函数。这里我们就是捕获所有的异常,然后重试一次。不过总共重试5次,这样可以避免如果第三方的服务器当掉我们的程序还在傻傻地重试。当然,5次重试过后,你可能会有自己的想法,不过我个人觉得抛出一个异常可能更合适,毕竟第三方的服务器当掉的话,程序再怎么运行,结果也是不正确的。
    最后,如果处理的数据比较多,那么对结果进行记录的过程最好能在处理过程中逐步地记录,即使程序崩溃了,前面处理好的数据也会保存在结果文件中,这样就不会丢失之前已经处理过的结果了。当然,如果当程序出问题时,能告诉显示器面前的人程序已经处理到哪里了更好。
posted on 2009-09-08 16:56  blacktear  阅读(363)  评论(0编辑  收藏  举报