风为人世在,在世人为风。

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

目前现状

在一些大公司中,每个服务几乎都有CDN,也就是说一个服务都有很多很多的服务器。并且一般做服务优化的话往往是把程序和静态资源放在不同的服务器上。

在实际开发中,一般是按功能将代码分成不同的模块。上线时OP一般是一个模块一个模块的上线。虽然上线时是并行上线的,但每个模块以及模板与静态资源生效是有时间差的。尤其是模块之间依赖程度很高,如:模板和静态资源依赖程度很高,上线有时间差极有可能出现JS报错或者一些点击不能响应。 所以在上线这个时间差内,用户在操作过程中极有可能出现问题。

解决方案

改变已有的一个模块一个模块的上线方案,而是先将所有要上线的文件都传到各个机器上去,并不是直接覆盖线上文件,而是通过一个的规则成为新建的文件。

如:我要上线覆盖的文件夹为 vote,那么先将代码都拷贝到vote.online文件下(各个机器),其他模块的代码拷贝到其他对应的文件夹下。待所有要上线的代码都准备好后,然后执行mv的操作,将要上线的代码覆盖到真正的文件夹下。在这个过程中,虽然要有时长,但这个时间要小很多。

借助自动化上线,这种方式要比现有的上线要快很多。上线时间差越小,对线上服务的影响越小。

特殊情况

上面讲的方式虽然将时间差缩小了很多,但还是有一些很小的时间差。对于一般的服务大家都是可以接受的,但对于一些交易类的服务(如:电子商务,金融),这种时间差还是不能接受的。对于这种要求非常严格的服务估计还是只能夜里停服务上线了。

Smarty中实现模板继承功能

在PHP+Smarty大行其道的今天,怎么样进行快速的模板开发成为了前端开发人员必须思考的问题。不同的页面,相同或者相似的页面结构是否进行了模块化处理,同样的头部或者尾部是否进行了内容分离决定了开发的效率。虽然Smarty本身支持include a file的功能,但这远远不够。我们需要的是不想重写同样的页面结构。

Jinja2的模板继承功能

Jinja是基于python的模板引擎,有个非常实用的功能就是模板继承。不太了解的可以去这里看详细的介绍http://opensource.csdn.net/bbs/thread/3943?lp=1

模板继承的好处就是你不在需要写整个页面,只要写页面的模块,然后用一个布局的页面套一下就可以了。并且页面中的模块书写顺序是无序的。

smarty本身并没有模板继承的功能,但我们可以通过block,capture和方法插件(其实block,capture也是插件)。 继续阅读 »