2008年12月4日星期四

服务治理

几年前,为了尝试JDK 1.5中的并发包,我写了一个多线程的爬虫程序,利用线程池来分析B2C网站上的商品价格,希望可以做一个shopping.com那样的比价网。

并发200个线程,每个线程从待爬URL队列中取得一个URL,取回网页,进行分析,找出其中的价格信息,再找出其中的URL链接。开发过程很正常,但在测试中遇到了问题。在爬了7万多个网页之后,程序开始越来越慢。凭感觉判断,有一些线程“死”掉了。

多线程的调试并不是件容易的事。这个问题很“难”再现。不是普通意义上的难再现,它每次都会出现。但要跑到7万多URL时,才会出现。我试过将线程池退化到1,想找出什么样的URL会导致线程死掉,但这个代价太大了,因为速度很慢。当时的IDE也缺乏对多线程调试的一些支持。而且即便有支持,可能也不太适合这种情况。后来因为种种原因,那个程序就不了了之了。

最近接触的SOA治理和彩色UML的内容给了我一些启发。我们需要关注服务执行的健康状况和服务执行的时间。例如,我们可以进行这样的改动:

在每个线程领取URL时,记录一个时间戳。在它完成这个URL处理时,再记录一个时间戳。再利用一个线程,对未完成的URL定时检查它的健康程度。如果在很长的一段时间内它还没完成,那么它就有问题。这样我们可以找到嫌疑URL。我们可以对这种URL单独测试,看看是否因为程序的原因,不能处理这样的URL。

或者,我们可以把对应的线程任务杀掉,直接跳过这些有问题的URL。

程序在设计时,要考虑运营维护需求,其中包括迅速故障疹断和纠正能力。这就是传说中的“可用性”需求吧。

没有评论: