门户首页静态发布的解决方案
公司自主开发一套门户管理系统(Portal)和文章内容管理系统(CMS),门户里portlet的定制支持AJAX和模板引擎(采用Freemarker做为模板引擎)。通过给几个客户的实施效果来看,AJAX方式并不适合被用在大并发量的页面上,尤其是在首页,首页上包含了多个portlet,如果都采用AJAX请求方式来获取数据,无疑是非常要命的。(以前采用过请求合并的方式来处理AJAX portlet的请求问题,大致做法是将请求相同地址的portlet请求通过特定格式合并,发到后台一个专门的servlet,再由该servlet解析该特殊的请求,通过地址转向分发请求到真实取数据地址,取回数据再由该servlet合并并返回给页面,页面再解析数据。这样的做法节省了多次发送XMLHttp请求的时间,一次即可,但也带来一个问题,需要等所有的portlet数据都获取到数据后才能加载portlet的数据)。而且AJAX方式portlet不支持普通网络爬虫抓取数据,难以对AJAX方式portlet开发的门户进行静态发布,也不能被Google、百度等搜索引擎抓取到。
为了解决AJAX方式portlet的问题,引进了模板引擎做portlet开发。在解析门户结构生成页面时候再用模板引擎(Freemarker)解析一边该生成的页面,从而取到各个portlet的数据。这样做法很好解决了上面AJAX方式portlet的问题(虽然也牺牲了AJAX方式单个刷新portlet的用户体验)。
结合模板引擎方式portlet,再对门户进行静态发布(可对整个门户静态发布,实现离线浏览的功能,但一般只需要对大并发量访问的页面比如首页进行静态发布即可),可极大提高页面访问的并发量。静态发布方式这里不详细叙述,我采用的是通过HttpClinet发送页面请求获取响应数据并保存为静态html页面的方法,可参考网上各种网络爬虫的实现方式。
至此还有两个问题需要解决,如何在用户访问门户的时候自动转向到静态发布出来的html地址(我们的门户地址一般发布为**.portal这样的快捷访问地址)?以及如何自动的更新静态html(首页内容会不时更新)?
第一个问题好解决,只需配置一个filter来过滤.portal结尾的请求地址,将他们重定向到对应的html页面地址。比如有一个gzcz.portal的快捷地址,则在静态发布该快捷地址时将发布出来的html页面保存成名为gzcz.portal.html的html页面。则用户访问gzcz.portal时通过过滤器很方便的可以转向到gzcz.portal.html地址。
第二个问题相对不好解决,虽然简单的可以通过定时静态发布的方法来解决,但怎么定时?定多长时间?以及用户访问时如果刚好赶上在定时重新发布怎么办?还有晚上、周末等门户信息不再有更新的时候再定时操作给机器带来不必要的性能负荷。也许可以在信息有更新的时候及时重新发布,但由于信息更新是在文章内容管理系统(CMS)里,信息的聚集和展示在门Portal端,对CMS里的信息来说,它只是被动的等待portlet来读取,而没法反过来作用portlet,所以这个方法也不行。最后决定由第一个问题解决办法里的过滤器结合静态发布机器人来处理,首先在机器人里维护一个池来记录各个页面地址的最后发布时间,然后每次过滤器过滤到.portal页面请求的时候,调用机器人来检查该页面的发布时间是否已经超过了设定的定期时间(如果信息更新频繁,可适当调短定期时间),如果是,则重新调用静态发布机器人进行发布后再访问静态html页面;否则就直接访问静态html页面。
通过性能测试,经过以上改进后门户首页的并发量得到了极大的提高。
作者简介:Jon.King(中文名苦行),男,从事软件开发3.5年。目前主要从事J2EE平台下
软件开发。涉及过财政类软件、门户类、内容管理类、统一用户管理类软件产品等开发,刚涉 足工作流引擎领域。个人邮箱MSN是[email protected],欢迎同道中人加我。