Facebook的網站速度做為最關鍵的公司任務之一。在2009年,我們成功實現了Facebook網站速度提升兩倍。而正是我們的工程師團隊的幾個關鍵的創新使它成為可能。在本文中,我將向大家介紹我們的秘密武器之一,我們稱之為BigPipe的偉大底層技術。
BigPipe是一個重新設計的基礎動態網頁服務體系。大致思路是,分解網頁成叫做Pagelets的小塊,然後透過網頁伺服器和瀏覽器建立管道並管理他們在不同階段的運作。這是類似於大多數現代微處理器的管線執行過程:多重指令管線透過不同的處理器執行單元,以達到效能的最佳。雖然BigPipe是對現有的服務網絡基礎過程的重新設計,但它卻不需要改變現有的網頁瀏覽器或伺服器,它完全使用PHP和JavaScript來實現。
動機
為了更好的了解BigPipe,我們需要了解現有的動態Web服務系統,它的歷史可以追溯到萬維網的初期,但現在與初期相比卻沒有太多改變。現代網站有著遠高於10年前的動態效果和互動性,但傳統的網頁服務系統早已無法跟上當今網路速度的要求。在傳統的模式,使用者請求的生命週期如下:
傳統模式在現代網站中效率是非常低的,因為很多系統的操作順序,不能互相重疊。一些如延時載入JavaScript、並行下載等優化技術已被網路社群廣泛採用,以此來克服的一些限制。然而,這些最佳化卻很少涉及Web伺服器和瀏覽器的執行順序所造成的瓶頸。當Web伺服器正忙著產生一個頁面,瀏覽器處於閒置狀態,浪費其周期無所事事。當網頁伺服器完成生成頁面,並將其發送到瀏覽器,瀏覽器則成為效能瓶頸並且網頁伺服器對其無從幫助。重疊Web伺服器的生成時間與瀏覽器的渲染時間,我們不僅可以減少最終的時間延遲,還能使網頁更早顯示用戶可見區域給用戶,從而大大減少用戶對延遲的感知。
Web伺服器的產生時間和瀏覽器的渲染時間重疊,是特別有用的,如Facebook這樣內容豐富的網站。一個典型的Facebook的網頁包含許多來源不同的資料資料:好友名單,好友動態,廣告等。在傳統的網頁呈現模式的使用者將不得不等到這些查詢資料都返回並產生最終文件,然後將其發送到使用者的電腦。任何一個查詢延遲都會拖慢整個最終檔案的產生。
BigPipe如何運作
要利用此網頁伺服器和瀏覽器之間的並行性,BigPipe首先分解網頁成多個可呼叫的Pagelets。正如管線微處理器劃分一個指令的生命週期為(如“取指令”,“指令解碼”,“執行”,“寫回暫存器”等)多個階段,BigPipe的頁面產生過程分為以下幾個階段:
出處: isd