相关文章:人人网移动开发架构(上)
真的可以统一架构吗?
可以,浏览器本身就是一个非常优秀的跨平台解决方案,但这个方案的前期投入非常大,且项目执行风险过高,人人网的业务大都是基本动态网页实现,使用了大量的AJAX及Flash技术,最终我们放弃了浏览器方案,我们要的统一架构肯定不是这个。
山穷水尽,柳暗花明
放弃了浏览器的方案,我们可谓山穷水尽,难道还有第三个方案?Facebook的iPhone应用给了我们很大灵感,看图:
图3
从产品的角度看,这个图显示的布局与我们***次尝试的设计没什么区别,深入一点我们会发现,这个设计与之前的设计***区别在于页面跳转,每个标签都有独 立的一个视图栈,理论上无限大,通过当前栈顶视图可以打开新的视图后自动压栈保存,当前视图如果要后退默认退回视图栈里保存的上一个视图的内容。那如果是 标签1的页面需要跳转到标签2对应的页面怎么办呢,是否自动切标签?答案是不切,标签只是用于业务导航,且有独立的视图栈,视图栈中的页面可以与业务无 关,打个很好理解的比方:当我们在使用Chrome的浏览器时,我们同时在多个标签分别打开多个不同网站或页面,也可以打开同样的网站或页面,每个标签都 有一个独立的后退的记录,这种设计非常有规律,用户容易理解不容易晕,现在页面跳转及后退的问题很好的解决了。不论JavaME,还是iPhone或者 Android的客户端,我们都使用了同样的设计。
数风流人物,还看今朝
当我们客户端都使用了这种标签+视图栈的方案以后,我们的各平台在设计上基本达到了统一,并在现有设计上快速迭代演进。大家可能想了,在代码层统一这才 叫本事,也许你没错,但是我们不会轻意再做这样高风险的尝试,如今手机平台的差异相当的大,就从主流平台的开发语言看就够你折腾了,JavaME及 Android是使用的Java , iPhone使用的是 Objective-C,Symbian是纯C++, 现在诺基亚与微软联姻WP7,可WP7将不再支持C/C++的开发,主推C# + Silverlight,好吧,我们只能再观察一下了。
在接下来的一到两年,移动互联网将以***的速度发展,大部分互联网公司都开始了或已经推出了较成熟的移动终端的解决方案,创业公司也会层出不穷,推出各种优秀的移动终端应用:移动支付,LBS,基本通讯簿的即时通信,手机音乐,手机视频,手机阅读等等,iPad点燃平板电脑的硝烟,平板的设计再次给了我们很大的挑战,数风流人物,还看今朝。
高可靠性和可扩展的服务
现在移动互联网拼的都是服务,客户端良好的用户体验背后,都有强大的服务器技术支撑,人人网也不外如是。
业务层次模型
人人网采用JavaEE技术作为主要的业务解决方案,基本按照通用的JavaEE模型进行架构设计,如下图:
图4 人人网业务层次模型
- WEB层基于REST风格和MVC设计模式,为用户提供基于WEB的访问接口人人网采用的是自己开发的WEB框架 Rose,该框架基于Spring Framework,类似RoR框架,增强了对Controller编码部分的默认约定和REST风格URL的支持,该项目前已开源,下载地址为http://code.google.com/p/paoding-rose/
- 业 务层封装业务逻辑,为WEB层提供业务接口,操作数据访问层提供的数据。人人网开发了自己的SOA框架XOA以支持业务层抽象,该框架结合Rose框架, 以REST风格对业务进行分类、消息格式封装和路由,如以下URL:xoa://blog.xoa.renren.com/photo/{user- id}/{photo-id}该URL代表某用户的某个照片,操作 GET/PUT/POST/DELETE分别对应对应照片资源的读、修改、新增、删除。即通过资源+操作的方式对外提供Service。 XOA支持远程调用,并可以通过简单添加服务器的方式进行横向扩展。该框架目前准备开源,敬请关注。
- 数据访问层提供对数据库访问的封装人人网使用Java语言开发了自己的Object-Relation Mapping框架JADE(Java Database Engine),并支持数据库的水平横向切分。该框架和Rose框架一体开源,下载地址相同。
- 数 据持久层数据的持久存储,主要采用MySQL数据库,并且开发了自己的海量存储系统Nuclear。Rose、Jade、XOA作为集成度很高的一整套解 决方案,在人人网大量采用,大大降低了开发成本,并在框架级解决了服务于企业解决方案的JavaEE技术在互联网领域的适用性。
可扩展的高性能系统
人人网每天都要承受亿级PV海量用户的并发压力,和其它大型互联网站点类似,服务器架构方面做了很多工作。
高性能数据存储系统
在数据存储方面,人人网做了以下工作:
- 和其它互联网大型站点相同,MySQL数据库做水平拆分以支持横向扩展
- 人人网作为国内***大SNS网站,欲存海量UGC数据,必有海量存储系统。Nuclear存储系统在高性能、高可靠、可扩展的海量数据存储需求下横空出世。
Nuclear本身的数据存储基于Key-Value形式,底层可以使用MySQL/Memory, Cassandra, TC, Redis等存储引擎,提供弱结构化的查询功能。
- 高扩展性一个Nuclear集群支持1到n(n<264)个节点(Node)的规模
- 高可靠性单个节点的crash永远对系统的运行造成影响,不存在单点风险。系统永远可写入。
- 高性能在4个节点、一般服务器配置情况下有测试数据表明单节点访问可达15862 req/s, 平均单次请求耗时仅5ms。
可扩展的高性能业务服务系统
人人网的业务层是支持分布式、可横向扩展的。
- 人人网主要使用JavaEE架构进行业务开发,其中Spring提供的IoC和AOP功能分别起到了业务对象装配和横向关注点分离的良好 抽象。XOA框架基于Spring和netty,使用google的spdy协议作为网络传输协议,除享受到Spring红利之外,也提供了基于Java NIO的网络高性能服务器环境。单个XOA服务是无状态的,具有幂等性,XOA客户端使用Java NIO、通过Keep alive保持对各个后台服务器的TCP长连接,可实时监测后台服务器的健康状况,并把用户请求负载分散到各个后台服务器上,在单个节点失效的情况下不影 响服务,如图5所示:
- 很多关键性的业务对性能要求特别高,也需要借助很多Linux操作系统的特性,这时Java的优化已经不能满足需求,需要使用 C++语言进行开发。人人网采用ICE框架, 进行这部分业务的开发,它解决了Java、C++等多种语言开发的框架和通讯问题。人人网目前使用ICE进行开发的业务层称之为中间层,主要解决类似搜 索、用户好友关系计算等性能要求苛刻的底层关键性业务问题。其运维模式和XOA类似。和其它大型网站一样,业务层使用Memcached作为业务层的分布 式数据缓存,且根据业务将缓存集群划分为多个池,集中进行管理,如图6所示:
-
图6 Memcached Pool
- 在WEB层,使用目前性能***的Servlet容器产品Resin作为HTTP Server,使用自行开发的Java WEB MVC框架Rose对用户请求请求分发。负载均衡方面使用了F5或者nginx。为了减少Session复制同步的开销,每台WEB Server都禁用Servlet Session, 即每台服务器都是无状态的,单个Web Server失效后,不会发生用户状态丢失的问题。用户状态的跟踪由中间层统一处理。
对移动终端的支持
服务器对移动终端的支持主要是通过HTTP协议提供json数据接口实现的,服务器基本采用了人人网共同的架构:
- HTTP WEB层做了更多的MVC抽象,除了提供基于html的Page View之外,还生成只提供json或者其他数据格式的Feed View。
- 服务器通过gzip压缩减少流量,节省用户资费。
- 客户端构建REST风格的HTTP请求,WEB服务器下发数据完成远程调用。
3G的API层直接面向移动终端,提供基于HTTP和其他Socket协议的服务器访问接口,并在业务层抽象出3G部门自己的公共平台,如图4所示:
图7 3G API架构
除此之外,针对移动终端的特点和中国特色的移动互联网环境,做了一些特殊的工作:
- 低端机型运算能力和内存资源都有限,API平台做了相应优化
- 复杂的运算服务器完成,减少移动终端负载。如图片的缩放、裁剪运算、图片质量就是服务器进行的。
- 客户端和服务器进行的数据输入输出尽量减小,这样可以节省内存存储。在表示相同数据的情况下,尽量采用数据量小且易于解析的格式。API平台使用了JSON,没有使用XML
- 为了减少用户资费,传输流量进行了控制
- nginx开启gzip压缩,减少网络传输流量。
- 中国移动的cmwap网关会自动对服务器输出的gzip流进行解压缩,从而使nginx的zip压缩失去了意义。这种情况下,api服务器对输出进行gzip压缩后,作为普通二进制流进行响应输出。
- 除了纯文本的json之外,api服务器也支持基于google protocol buffers格式的输出,从而提供更紧凑的格式输出。
- 提高客户端访问速度
- Api平台支持基于逻辑时序的批处理操作,将多个api的网络接口调用合并为一个,减少多次tcp握手造成的巨大时间损耗,提高客户端每个UI界面的响应和显示速度。