09月06, 2011

续: 如何减少代码上线过程中对服务的影响

之前写过如何减少代码上线过程中对线上服务的影响,文中提到的方法是将所有的代码上到服务器的一个临时目录,然后一起操作cp到目标目录。这种方式虽然可以大大的减少上线过程中对线上服务的影响,可以影响时间缩短到2分钟以内。但对于0故障的服务来说,2分钟的服务故障还是非常不能接受的(比如:百度新首页)。

由于静态文件和模版是上到不同的服务器,静态文件还部署到CDN。模版是和后端代码放在一起。这样如果还是原文件名的不能彻底解决问题。

我们知道,任何的静态文件最开始都是在模版里引用了才生效,比如:在模版里有个link,或者有个外链的script。

通过分析,如果上线的时候,将静态文件先上,并且将有改动的静态文件全部重命名的话就可以彻底解决这个问题。一方面静态文件重命名后不会干扰线上正在使用的静态文件,另一方面模版还没上的时候,这部分新的静态文件将不会引用,待模版上线后就会全面切到新的静态文件模式下。

虽然这种方式是行得通的,但如果是手工去做重命名静态文件的方式是完全不现实的,并且人工的方式还极容易出现遗漏的情况。那如何去解决呢?

通过编译平台去解决,代码开发完后,在编译的时候,编译平台会自动分析静态文件的引用情况,并且计算该静态文件的md5值,并且取其中的几位(如:后8位),与原文件名一起组成新的文件名,将引用静态文件的地方的地址替换成新的地址,这样就完成了静态文件引用自动更新地址的情况。包含:模版里引用了静态文件,css里引用了图片,JS里可能引用了图片或者flash等。

比如:百度新首页里的源代码

服务

如上图:开发的时候使用的

<script type="text/javascript" src="http://su.bdimg.com/static/superpage/js/superbase_88722c3f.js"></script>

,编译的时候会自动编译成上面的形式。

这种方式还一个好处就是:即使代码需要回滚也只用回滚模版就可以了,静态文件是不用回滚的。

可能有同学担心始终都是新文件模式上线的化,会不会导致线上文件特别多?

这种担心是有的,但一般静态文件都不是太大,即使一年下来也不会有太多,并且现在的硬盘都超级大。相对于一天几百G的web server日志来说,这点真不算什么。

本文链接:http://welefen.com/post/how-to-reduce-bad-service-on-code-update.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。