本文整理自:http://www.cnblogs.com/sunli/archive/2011/02/19/mobile_architecture.html
今天参加了InfoQ组织的百度技术沙龙活动“移动互联网基础技术解析——无线搜索与HTML5开发”,在最后的Open Space环节主持了一个话题“移动互联网系统架构的特点”,现在把讨论的一些重点给记录一下。
(一)并发性总结:以上为今天讨论的移动互联网架构相对于有线互联网的特点,其中大部分还是跟有线互联网是一样的,比如数据库架构,存储的架构等等。
下面整理自:http://www.cnblogs.com/sunli/archive/2010/12/20/imcp.html
下面以手机凤凰网为例来介绍移动互联网系统的架构实践。
我相信一个好的系统架构是需要从产品需求出发的,同时我也相信一个系统的性能优化也要站在产品需求之上,所以我花了很多时间从产品设计的角度来分析为什么要设计内容平台,以及如何去设计这样一个系统,这就是系统架构,最后才在这个系统架构基础之上提出怎么进行性能优化,满足非功能性需求。
作为开发人员,我经历了固定互联网的一个高速发展时期。曾经,我们会频繁的开发出不同的网站,比如图片展示的系统,新闻站点等等以内容为主的系统,为了提高开发效率,摒弃开发网站的复杂性,出现了CMS系统。比如中小型网站比较通用的CMS系统(php168,phpcms等)和门户型CMS(定制化的大型CMS系统),CMS系统简化了网站的开发的难度,而且不需要特别的技术,就能构建出高性能,稳定的站点。
今年开始,移动GPRS资费的下调,3G网络的发展,智能手机的铺天盖地的流行,我们手机凤凰网的流量出现了非常大的增长,据我了解,很多公司都出现了大量的流量增长(见PPT第三页)。
移动互联网的发展给程序员提出了更高的挑战:
1、多运营商(电信,移动,联通,wifi用户),互访速度跟固定互联网的网通电信南北互通一样
2、多终端(超级多的手机类型,屏幕,系统,浏览器),出现更多的适配问题(不像固定互联网只是IE6,IE7和firefox,chrome的兼容)
3、 需求多变(要求快),由于快速的开发,导致开发的系统过一段就性能低下,经常宕机,程序员的压力很大,很大,很大。(ps:某某公司的无线技术人员已经死了两个了)
4、 访问量节节飙升 ,需要系统具有更高的性能和可扩展性。
5、页面几乎不能静态化(适配,按客户端等客户信息输出不同的内容),固定互联网可以生成静态html,使用cdn,来提高性能,由于不能静态化,移动互联网对性能的要求就更高。
手机凤凰网的上一版本(WAPCMS)系统的架构使用了普通的JSP+Mysql+Linuxi架构。(PPT的第5,6页)。通过Mysql的主从复制进行扩展,前端通过一个自行开发的反向代理进行cache(融入了业务逻辑代码)。由于频繁的代码更新,增加很多新的合作站点(jsp),代码非常的难于维护,性能也非常低下。当时10多台机器才应付1000多万pv/日,还会出现宕机。你可能会说,这个系统性能还可以优化,是的,还可以优化,性能非常低,但是由于要疲于应付提出的新的需求,就算优化了,没过多久,就又会出现性能下降。所以我们需要一个系统,像facebook在会上提出的那样,“如何让网站一直都很快”,是的,要让网站一直都很快,性能高,稳定,不管开发人员怎么折腾,系统总是很快的,性能很高的,所以,我们开发了IMCP系统。
IMCP(Ifeng Mobile Content Platform)不只是我们的wap网站的系统,还提供了凤凰移动台,视频客户端,凤凰新闻客户端,支持活动直播,在线代码开发,平均单机性能最高达到1800+万pv/日。开发人员在我们的平台上,无需考虑性能问题,只需要简单的调用系统提供的sdk的方法就能开发出高性能的网站。
到ppt第9页。为了尽可能设计出一个通用的系统平台,我们对网页进行了拆分。我们认为,网页都是由可拆分的块组成的。这些块包含可编辑的静态的html块(手工编辑的),自动产生的列表(文章列表)块,推荐位(由编辑手工选择的列表),内容文档块。一般固定互联网的新闻站点都可以由这些块组成,我们移动互联网由于是基于动态页面,所以我们还加入了逻辑块,来控制所有的块的逻辑。
由于要开发人员要经常为一些合作站点,比如要为诺基亚开发一个跟主站类似的站点,只是某些内容不一样的站点,一般都要拷贝一份代码。所以我们又计划把代码拆分成逻辑块进行重用,页面也尽可能的重用,可以在线的建立站点,不需要运维部门的参与。所以就计划把我们的代码是存储在nosql代码库中,由NoSQL管理所有的代码存储,通过后台进行在线编辑。前台访问的时候再去nosql取代码进行运行。通过NOSQL的主从复制实现跨机器,跨机房的代码自动部署。
在这样的模式下面,开发人员只需要在后台进行在线开发,不需要关心代码运行在什么IP的服务器上,需要去连接什么IP的存储,数据库,一切都是透明的,要取某个文章的内容,就直接getDoc(id)就可以了。
ppt13-22页进行了一些后台界面的演示
ppt后面的内容都基本能看明白了,其中非常有意义的就是我们的前端完全基于nosql数据,这也算是nosql 的一个成功利用的案例吧,由于ppt比较清楚,我就不详细阐述了。最后一页的代码运行性能监控我相信对很多朋友也有参考意义,通过对代码运行状态监控,可以实时的看到系统的相信运行性能状态。
这次velocity china 2010给我最大的感受就是,各个公司都有底层团队在致力于帮助开发人员简化开发的复杂度,自动化的提高系统的性能,稳定性(让开发人员不再关心这些问题)。我们的IMCP系统也是这样,开发人员无需关心cache,无需关心性能,只要利用我们SDK提供的功能搭建系统,网站总是非常高效,而且开发速度还非常快。