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.aygfsteel.com/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 墨菲
          不錯 頂
          主站蜘蛛池模板: 句容市| 广宗县| 长阳| 平潭县| 浮山县| 武穴市| 晋城| 凭祥市| 芦溪县| 通榆县| 邹平县| 白城市| 侯马市| 高尔夫| 洛浦县| 那坡县| 东明县| 吉木乃县| 扬州市| 莫力| 台东市| 胶州市| 凤山市| 西丰县| 安龙县| 广灵县| 金塔县| 江阴市| 承德市| 固始县| 武威市| 石楼县| 全椒县| 台山市| 萨迦县| 临夏县| 乐业县| 高密市| 乌拉特前旗| 尖扎县| 深圳市|