人人网移动开发架构统一问题服务器架构设计(2)

http://www.itjxue.com  2015-08-07 20:58  来源:未知  点击次数: 

首战不利,大家心里都不是滋味,虽然通过后几个月的努力,最后我们决定将1.2版本的客户端以beta 版本的形式发布,并公开提供了下载,除了拍照上传这个功能让我们值得高兴一下之外,其它功能也许只是让我们感觉能用而已。JavaME的失利让我们从自负中清醒,骄兵必败。经过一段时间的讨论与分析,大家一致认为,我们需要一个手机浏览器,人人的业务不论在PC端还是手机端,最理想的展现方式还是浏览器,于是我们开始手机浏览器研发道路,我们花了3-4个月的时间,开发出了我们第一个基于JavaME的浏览器引擎,代号:Across(为什么起这个名,后面说)。浏览器引擎架构参考Webkit,如下图:

图2 Across浏览器结构图

上图中蓝色部分是我们引擎的实现部分,红色的JS,CSS及Plug-in是未来的计划,从技术角度看来,这个架构看上去非常的美,模块功能划分清晰且扩展性强,我们只要重写Render Engine可以把一个普通的页面渲染成我们想要的任何效果,遗憾的是最终我们还是没有把浏览器这个解决方案应用到正式发布的人人客户端版本,原因很简单,它还不是很完善。我们预先做了大量的测试用例,在完成开发以后,我们按测试用例逐条进行了测试,最终结论虽然在性能和xhtml标签支持上达到了我们的预期,但稳定性和包体积却并没有达到理想的状态:运行时内存消耗在xhtml页面大小的8-10倍左右,如一个30K的xhtml页面完成解析,渲染必须保证有300K左右的空闲内存,如果渲染多个页面或频繁渲染新的页面,就很容易出现崩溃(后来我们发现代码中还有存在一些内存泄漏的地方);另外,打包以后200k的体积对于JavaME手机来说已经大了。09年上半年,Android发布了1.5的SDK,iPhone入华的消息也是传得到处都是,显然,在这样的行业形势下,公司管理层已经对我们在JavaME上做浏览器引擎的计划失去兴趣,我们的工程师被重新安排了新的任务,Across没有见到用户就成了历史,浏览器没有救得了我们。

痛苦中反思

09年上半年是我们最痛苦的一段时间,折腾了大半个年头,结果我们没有发布一个值得骄傲的产品,市场却快速变化着,iPhone,Android带着闪耀的光芒进入了大家的视野,我们也不得不做出调整,开始分兵投入iPhone及Android的阵营。我们开始反省前面的失败,我们似乎走了两个极端,第一次在考虑产品及技术的架构时过于的简单草率,以致后期面临强大的心理压力,第二次却是一个典型的过度设计案例,虽然从技术角度看这是一个非常有挑战且非常有意思的项目,当时我们的设想是先完成JavaME平台的浏览器,然后移植Symbian等其它平台,统一架构。但是移动互联网市场近几年的急速变化,不论从人力和时间上都不允许我们再把浏览器项目继续下去。

为什么我们要统一架构?

人人网的业务种类非常多,而且PC端都基于浏览器网页的模式,不论内容还是排版都经常需要优化变更,如果我们通过纯客户端的形式把全部现有业务迁移到到手机端,那么,当我们完成第5个业务的迁移时,可以前两个业务主站已经发生了变更,或者客户端刚刚上线之前的某个业务已经需要兼容运行了,在这种情况下,要么我们能快速迭代客户端版本,赶上主站的业务的迭代速度,要么我们使用浏览器或类似浏览器的模式,所有业务放在服务器做,这就是我们为什么考虑开发Across,名字意在横跨所有手机终端平台。

真的可以统一架构吗?

可以,浏览器本身就是一个非常优秀的跨平台解决方案,但这个方案的前期投入非常大,且项目执行风险过高,人人网的业务大都是基本动态网页实现,使用了大量的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点燃平板电脑的硝烟,平板的设计再次给了我们很大的挑战,数风流人物,还看今朝。

(责任编辑:IT教学网)

更多