Velocity China 2010大會回顧
Velocity China 2010 北京之行收獲良多,選擇的幾個session都很有料,當然也有個別還是比較虛。
這次大會主題是web性能和運維,主題也基本分為兩大塊:web前端性能,分布式。
接下來就把我參加的session逐個回顧一下:
《Facebook網站的Ajax化、緩存和流水線 》Changhao Jiang(Facebook)
在這個報告中,我將介紹在Facebook網站前端性能優化中采用的最主要的一些技術。這些技術不光降低了服務器的開銷,而且同時極大地提高了Facebook網站的用戶體驗性能。
我將首先介紹Quickling技術。通過Quickling,Facebook將所有的用戶點擊訪問自動地轉變成AJAX調用,避免了大量的服務器端重復計算和客戶端的重復渲染。
然后我將介紹基于Quickling的PageCache技術,通過JavaScript自動緩存用戶訪問過的頁面,極大的加速Facebook主頁的性能并降低服務器開銷。
最后,我將介紹BigPipe技術,通過采用微處理器內的流水線技術,將Facebook網站用戶感知性能加速一倍以上。
《靜態網頁資源的管理和優化》David Wei(Facebook)
靜態網頁資源包括Javascript、CSS和圖標圖片,它們是現代網站不可缺少的部分。而這部分的性能又直接影響了網頁的速度。在這個講座里,我將與大家分享我們在靜態網頁資源的管理和優化上的經驗。Facebook的五億活躍用戶來自五湖四海:不同文化、不同的語言、不同的網絡鏈接質量。巨大的用戶差異性給我們的靜態網頁資源管理提出了很多新的挑戰。這個講座將圍繞這些挑戰討論:
- 系統架構:為全公司開發團隊的提供簡易透明的靜態網頁資源編程接口;
- 系統擴展性:研發一個可擴展的靜態資源管理,以滿足不斷增長的網站功能、不斷增加的用戶語言和不斷變化的個性化策略
- 自適應性:為靜態資源管理研發自適應的優化模塊,讓系統隨功能的增減和用戶使用方式的變化自動調節,幾乎不需要人力干預。
facebook本次的幾個分享都相當給力,絕對讓聽的人不虛此行,想必對fb的bigpipe技術早有耳聞,這次算是大揭秘了,把技術細節和思路都詳細介紹并用實例進行了說明
上圖就是fb的前端優化使用到的三個主要技術,Quickling是他們的異步(ajax)框架,用于整個fb網站的ajax化,
使用過fb的話可以發現,網站在頁面切換過程中并不像傳統頁面加載一樣,進入一個新頁面瀏覽器就整個頁面重新渲染,特別是當你點擊后退的時候,上一個頁面幾乎是立刻出現的,這里便是quickling+pagecache的優化。quickling負責在切換頁面的時候清空主體內容區域,發送ajax加載新的內容,下載需要的JavaScript、CSS等資源,然后呈現新的頁面,被清空的頁面被保存在pagecache中,當用戶點擊后退的時候立刻從中恢復上一個頁面,他們在這個過程中還模擬了瀏覽器加載效果,地址變換等。
上面描述了要實現這樣一個頁面前端處理模型所使用到的具體技術細節,要模擬瀏覽器前進后退行為,因而需要記錄用戶的操作歷史,在同一個窗口頻繁加載/卸載頁面,頁面中積累了大量的css資源,也需要能夠在不需要的時候被卸載掉,一些settimeout定時器也需要被管理,在切換頁面的時候被重置或移除。
在使用quickling+pagecache提升性能的同時,也存在一些挑戰:
被緩存的頁面和用戶當前操作的頁面存在數據關聯時如何同步pagecahce?緩存一致性如何保障?
fb的用戶主頁(home)有用戶的動態(新鮮事),會隨著用戶在其他頁面的操作而產生更新,當home被從緩存中重建后如何知曉這個變化并作出更新的呢?
這里使用到了一個“replayable”記錄重播技術來解決這個問題:
所有的ajax post調用均會被記錄,在緩存頁面被重新呈現的時候,進行“重播”,來達到更新的效果,pagecache本身也提供了callback機制,在重建頁面的時候允許指定執行一些額外的動作。
最后一個bigpipe,前面2個技術加上這個,算是把web前端性能做到極致了,bigpipe更帶來了工程上的意義,在達到優化頁面并行加載的同時,模塊化的開發也讓fb的優雅降級,分工,超短周期迭代成為可能。
講bigpipe之前,先需要介紹pagelet,
pagelet就是作為模塊的單位,定義了一個模塊需要的js,css,html等信息,bigpipe.js便作為一個客戶端按照pagelet的信息來解釋并呈現一個個模塊,
值得一提的是,pagelet在模塊化的同時,還提供了高級特性,比如:嵌套,優先級,關聯性等,來滿足應用層面的需求,使用上,對php而言,只是繼承一個pagelet基類,提供該有信息,然后再在bigpipe客戶端注冊這個pagelet。
這次大會的幾個主題還有一個共同點就是:都在努力設計和實現一個適合于自己業務的框架或平臺,使得這種性能優化等最佳實踐可以被傳播應用在任何一個具體業務應用中,而無須讓產品開發者過多關注,可以簡易的被使用而達到好的效果,并通過架構約束來實現大型團隊的開發模式管理,fb的另外一個靜態資源優化方面的主題就是一個很好例子
靜態資源管理,看似簡單,而fb算是做到極致了,之前也曾思考并嘗試一些方式來做自動化的資源管理,但離fb的深入度還是差一個量級~
自動化的伸縮性,自適應性,用節點模型來描述資源,通過繪制節點關系圖,和引用計數等方式生成一張成本/收益圖來自動進行決策,從而自動的進行打包并輸出給客戶端,同時還會根據用戶的區域,語言等信息,選取合適的資源進行打包。
在開發使用上,通過開發人員的注釋約定識別這種引用關系,監控各種資源文件的使用情況。
《騰訊相冊存儲系統》 謝明 (騰訊)
低調的tx的分享,全場爆滿,聽后不得不說是一個讓人敬畏的對手。
tx的TFS分為LogFileSystem和ImageFileSystem,相冊會生成多種規格的圖片,他們也有自己的KV叫TDB,值得一提的是TFS是直接讀寫裸設備,他們也同樣大量定制自己規格的server,存儲等。
《構建高性能的MySQL系統》 楊海朝(新浪)
海量數據已經是近年來很火的話題了,使得存儲,數據庫的話題備受關注,特別是云存儲概念出來后,各種熱議,國內的各大互聯網公司也都開始有大規模的實踐案例。
不過這位sina的首席DBA沒有往大的講,而是選擇講了一些MySql優化原則方面的東西,介紹了MYSQL的兩個表存儲引擎MyISAM和InnoDB的差異和使用場景。
前者關系型,不適合做HA,因為一旦down了之后repaire時間太長,鎖級別是tablelock。
后者適合大字段R/W高的,具有高可用性高并發,鎖級別是rowlock。
索引個數在3-5個以內合適,在需要的時候覆蓋索引可以獲得很好的性能,如sort,count,組合索引要注意索引和列的次序。
MySql特別適合分布式場景,讀寫分離架構下甚至可以讓M、S使用不同的存儲索引根據場景優化。
對于應用,有一個重要觀點就是:對于應用層面應該弱化DB,只需要認為DB是一個存儲即可,這樣的設計才能做到scacle-out。說到這點,再加上盛大創新院許式偉的《分布式存儲與Web服務伸縮性》,基本上可以說,存儲還是讓有資源的巨頭去搗騰吧,關注應用才是更能快速獲取價值的:)
《構建Yahoo下一代Mail》 Daniel Hunt(Yahoo!)
從幾場老外的主題里,基本得出一個結論,他們對性能和體驗的重視程度遠高于國內企業。
《卷土重來:服務器端JavaScript》 Douglas Crockford(Yahoo!)
老道的主題自然吸引無數人,服務器端js也是近期火起來的話題了,只是實在不懂為什么是在chrome的v8引擎起來了才火了,相信js的語言魅力已經讓大多數web開發者愛上它了,而今讓它不僅跑在瀏覽器里,還能run在server上,讓server編程也獲得事件模型的好處,是不是很讓人興奮?
node.js是一個嘗試,之后準備關注一下,其實乍一看這個標題,你可能或想到另外一種解釋:瀏覽器不支持js的時候讓它跑在服務器端,這樣是不是更有吸引力?恰巧這個想法在yahoo的《構建Yahoo下一代Mail》中有提高,用戶多樣性使得他們必須滿足這種情況,他們因此提供了這樣一種模型來支撐這種編程模型,讓你只需要知曉一個中間語言,從而能編寫出client or server script,很誘人吧,所以這個也準備去關注了。
《Facebook: 一個可持續發展的高性能網站》 David Wei(Facebook)
這個主題就是上文提到的一個觀點的完整版,用架構去支撐你的網站持續的發展,保持簡單,而又能獲得性能的收益。Fast By Default(與生俱來的快)。
我歸納的幾點:
- 數據驅動,獲取足夠的數據來支撐你的優化決策,要讓性能工作可以被測量;
- 讓開發人員遵循簡單的約定就可以編寫出高性能的應用;
- 不符合約定的代碼應越早被發現,開發過程中就要暴露出來,這要求你的框架有這樣嚴謹的支持;
- 減少人工的,臨時的優化工作,通過建立各種模型來提供支持;
- 組件化,模塊化,豐富的開發參考文檔,便于使用和理解的代碼片段參考;
- 隱藏細節,讓性能小組、架構者獲得主動權。
還有幾個技巧點:
- 把腳本作為文本加載避免阻塞;
- 利用iframe的沙箱環境來實現一些緩存,預加載之類的效果;
- 用new Image()來預加載js。
《分布式存儲與Web服務伸縮性》 許式偉(盛大創新院)
最深的印象是:存儲不是誰都需要去做的,太消耗腦細胞,對創業者的規勸。
《移動互聯網內容平臺的架構與性能優化》 孫立(鳳凰網)
很務實的一位speaker,把ifeng的IMCP平臺架構描述的清清楚楚,他們的場景使得CodeOnline尤為合適,人員成本,開發管理等思想也是我比較傾向的。
《CWF:C++用于web開發的實踐》 邵軍輝(人人網)
很有意思的哥們,號稱愿望是讓C++在web開發有一席之地,對于Mashup比較感興趣,所以特地來聽了這場,確實有不少的亮點,CTemplate號稱沒有XSS問題。
這場讓我看到了主流web技術之外的實踐,算是偏好+性能追求極致的實踐吧
不過自行構建這樣一個web框架,一系列的工具都需要自行開發,同時還要考慮開發成本,難度等,不容易啊。
這也讓我想到:各種各樣的團隊,主導者往往有這樣的幸運能夠有機會能主導自己的架構,并組建一個團隊共同發展,不過這個發展一旦主導者離開而沒有能夠完成足夠的沉淀,恐怕之后很難維持吧。
IE9&Mozilla Firefox4
兩個知名瀏覽器在同一個屋檐下宣傳,相敬如賓啊,哈。
IE9演示了GPU加速的性能,和chrome對比,讓現場如此多的google迷情何以堪啊…
PPT下載:http://velocity.oreilly.com.cn/index.php?func=slidesvideos