posts - 36, comments - 419, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

没事使用代理上了下facebook,注册进入个人首页后,习惯性的查看源代码,发现了1个很有意思的现象,首页内容不少,但源代码中HTML的代码却很少,但去多出了很多段的javascript代码,这些js代码都是用于动态生成html的,facebook为什么需要这样做了?出于职业习惯,研究研究:

 

一、html代码。

     先看看首页查看的源代码,因为源代码比较大,所以把图片压缩了下,可能看不太清楚,只需要注意图中红色是html代码,其余黑压压一片的就全部是JS代码:

 

二、JS代码

     看到黑压压的JS代码是不是被吓一跳,下面就截取一段JS来分析(其余段的JS都是类似的),facebook源代码中充斥了类似于下面的JS代码:

 


 

让我们再看看big_pipe.onPageletArrive函数到底做了什么了?我们只关注参数中的id,js,css,content4个参数,可以看出js和css都是进行过编码,下面是解码后我们关注的代码:

看到还原后的JS,你应该猜出onPageletArrive函数是干嘛的吧,其实onPageletArrive最主要实现就是把"content"中的html内容插入到对应id(上面的"pagelet_welcome_box")的html元素中,并下载对应的css和JS。

 

三、chunk、flush

      看到上面的分析后,大家一定奇怪,facebook为什么要生成那么多段JS,再用js去动态插入html代码,这不是脱了裤子放屁,多此一举吗?还不如直接生成html代码了。facebook当然不会那么笨了,让我们先监控下facebook的http请求,监控图如下:

      注意上图中红色部分,原来facebook使用了chunk对页面进行分块输出。这就比较容易理解了,facebook首页的js代码段不是1次就全部输出的,而是一段一段进行输出的。

      什么是chunk和如何使用chunk,请参考我的另1篇博文:flush让页面分块,逐步呈现

 

总结

     facebook使用chunk技术让页面分块输出成很多JS段,这样做的好处就是服务器和客户端可以并行进行处理,不用等服务器全部处理完毕,客户端才进行处理。

     举个博客园首页的列子,博客园首页分为下面几块("推荐博客排行","首页随笔列表","最新新闻"...),

     我们一般对该http请求处理如下:

         1. 浏览器发送http请求

         2. 服务器处理请求(从缓存读取前50个推荐博客,从数据库读取"首页随笔列表",从数据库读取"最新新闻"),生成首页的html代码。

         3. 服务器发送html代码给客户端

         4、浏览器接收到响应,处理html(下载css,js,image,执行js等等)

    可以看出传统的http请求4个过程中,每个过程都必须等待前1个过程完成后才能执行,这样就存在很大的资源浪费。

 

    facebook的对该http请求的处理如下:

        1. 浏览器发送http请求

        2. 服务器处理请求(从缓存读取前50个推荐博客,生成"推荐博客"的js代码段,flush输出该代码段,

服务器继续读取"首页随笔列表",并生成输入js代码段。

服务器继续读取"最新新闻",并生成输入js代码段。

        3. 浏览器接收到js代码段,下载该代码段所需的js和css。插入html代码。

     在这个处理流程中,最大的特点就是2,3是并行进行处理的,服务器处理完一部分数据就把已经处理好的数据交给浏览器进行呈现处理,自己再继续处理其他的数据。

 

PS:文章看完了,有些同学可能会想,为什么不像博客园一样,前台全部用ajax来异步读取"推荐博客" ,“最新新闻”的数据了,这样做就不会出现因为要处理太多数据而让客户端等待太久的问题了。我觉得对于facebook这种并发量巨大的网站,使用这种方法无疑会产生太多的请求,比如facebook首页用了14个chunk,如果使用ajax,则需要多14个request请求,这将增加不少服务器的压力吧。     

 

相关文章: 名站技术分析 — 浅谈tudou.com首页图片延迟加载的效果



[作者]:BearRui(AK-47)
[博客]: http://www.blogjava.net/bearrui/
[声明]:本博所有文章版权归作者所有(除特殊说明以外),转载请注明出处.
英雄,别走啊,帮哥评论下:  

精彩推荐 好文要顶 水平一般 看不懂 还需努力

评论

# re: 名站技术分析 — facebook奇特的页面加载技术  回复  更多评论   

2010-06-17 15:15 by 特立独行
文章很精彩,推荐一下!

# re: 名站技术分析 — facebook奇特的页面加载技术  回复  更多评论   

2010-06-17 18:44 by rox
好文章,顶一下!

# re: 名站技术分析 — facebook奇特的页面加载技术  回复  更多评论   

2010-06-17 20:21 by BearRui(AK-47)
谢谢楼上二位支持...

# re: 名站技术分析 — facebook奇特的页面加载技术  回复  更多评论   

2010-06-18 01:05 by Jie
文章很精彩,推荐一下!

# re: 名站技术分析 — facebook奇特的页面加载技术  回复  更多评论   

2010-06-18 16:34 by fanfan
好文章!
我后来想,为什么服务器对于分片的部分不能并行处理,然后一起发给客户端,这样效率不更高么?但是这样的话,系统的瓶颈全聚集在server端,伸缩性更差了。

# re: 名站技术分析 — facebook奇特的页面加载技术  回复  更多评论   

2010-06-18 16:45 by BearRui(AK-47)
@fanfan
对,服务器并行处理,就提高了服务器的压力,而且要在服务器端用多线程进行并行处理,代码会写的非常复杂。

# re: 名站技术分析 — facebook奇特的页面加载技术  回复  更多评论   

2010-06-18 21:39 by BeanSoft
好文章,顶一下! 精品文章! 评论框也很棒!

# re: 名站技术分析 — facebook奇特的页面加载技术  回复  更多评论   

2010-06-18 21:49 by BearRui(AK-47)
@BeanSoft
老大经常来捧场啊,非常感谢。

现在怎么没去看世界杯,呵呵。

# re: 名站技术分析 — facebook奇特的页面加载技术  回复  更多评论   

2010-06-24 11:50 by thomas sabo uhren sale
写的不错,留着以后有用。

# re: 名站技术分析 — facebook奇特的页面加载技术  回复  更多评论   

2010-06-24 11:52 by authentic pandora charms
呵呵喜欢

# re: 名站技术分析 — facebook奇特的页面加载技术  回复  更多评论   

2010-06-24 12:18 by BearRui(AK-47)
谢谢支持,^_^

# re: 名站技术分析 — facebook奇特的页面加载技术  回复  更多评论   

2010-12-09 17:24 by liangkun
有的不是很明白,

# re: 名站技术分析 — facebook奇特的页面加载技术  回复  更多评论   

2014-04-11 19:51 by 墨菲
不错 顶

只有注册用户登录后才能发表评论。


网站导航: