目標:
開發高效能,可擴充的WEB應用。
1.WEB應用的分層
a.前端
b.後端
a.前端最佳化的重要性。分析工具GA和YSLOW
1.一個request之前要做的最佳化。
2.不要緊盯WEB後端最佳化。儘可能的訪問伺服器之前,消滅掉request.
前端最佳化的方法
1.減少http請求。
方法:合并圖片:使用CSS或者HTML的MAP標籤來定位。
合并指令碼和樣式表:視情況而定。同一功能的耦合在一個指令碼發布。如果是landing page和index頁可以考慮使用內聯腳 本和CSS的方法
2.緩衝圖片和指令碼.
方法:再web伺服器設定Expires頭。據統計大概60%以上使用者帶有完整緩衝。要做的就是發布JS,CSS之類的指令碼要帶有版本號碼。 應對及時更新。
3.壓縮一些組件。
方法:壓縮的是XML,JSON。不要壓縮圖片。圖片應該由本身格式來壓縮最佳化如PNG,GIF,JPG。APACHE1.x和2.x配置不同。
4.樣式表的位置。
方法:儘可能的放在頂部。LINK要放到HEAD之中,不要使用@import.可能還會最後下載。
5.js指令碼放在底部
方法:儘可能的放在底部。視情況而定,有些js控制顯示的要放在上面了。增加並行下載的能力。視CPU和頻寬來決定。
6.使用外部的CSS和JS
方法:方便緩衝。合并壓縮CSS.工具有JSMIN和YUI COMPRESSOR。首頁和著陸頁使用內聯較好。
前端技術推薦:CSS架構 960GRID網格展示和JS架構JQUERY。(瀏覽器安全色性佳)。
b.後端最佳化。(Java)
本質:web伺服器的叢集-》分布式緩衝-》資料庫叢集。
1.WEB伺服器叢集:
選擇:nginx,apache,lighttpd 執行緒模式。
apache:穩定。多進程開銷大,並發處理能力低。相對安全。子進程崩潰不影響其他的進程。並發數100左右可以考慮。
高效能推薦:nginx.普及門戶高穩定性 介於apache和lighttpd之間。CPU記憶體佔用非常之低。高並發APACHE線程過多導致死掉,只能重啟。。lighttpd圖片伺服器。
使用方式:
nginx:163,renren,douban,sina,qq 版本各異。。。
lighttpd:未知。flickr圖片伺服器。早期豆瓣。
apache:很多了。
負載平衡:DNS.HAPROXY 4層負載。
2.分布式緩衝
沒什麼疑問了 當下最流行memcached.用戶端分布式。設計緩衝一定要注意的是緩衝是不可靠的。命中率的問題。緩衝的擴充為key的md5(十六進位字串)加密。截取前5位轉 十進位,然後取餘數。% 值就是伺服器編號。
3.資料庫(MySQL)
最終思想為讀寫分離。選擇合適的儲存引擎(MyISAM,INNODB)。索引的最佳化。
儲存引擎:
選擇合適的儲存引擎需要如下考慮:1事物。2.並發。
1.事務,如果支援事務的話,不用考慮了直接使用innodb.
2.並發,多查詢少寫入。最好為MyISAM.多寫入多查詢那種。適合Innodb。因為Innodb本身是行鎖。批次更新。多查詢還是MyISAM。
對經常查詢的資料庫加上緩衝設定。線程池的最佳化。
索引:
1.多查詢的表 要加索引。同樣的索引帶來的副作用就是插入更新的緩慢。再就是佔用硬碟空間。
2.要注意索引的順序。比如 firstname加索引 lastname沒有加。如果 lastname在firstname之前索引就失效。
3.要把列單獨隔離,不要對列進行操作。如where DATE_FOMAT(reportdate)=?
又出現一個問題。如何避免JOIN查詢。
非範式化。KEY-VALUE.資料庫。最近研究couchdb apache ab -n1000 -c200 request/s 2590.無最佳化。優點JSON。直接返回JSON。
MySQL方案。。預存程序+shell
其他選擇memcachedb.(memcached協議+伯克利DB),MongoDB。是對關係型資料庫的一個彌補。
主從複製+MySQL Proxy 。或者 水平資料分割。userid%10 垂直資料分割 。不相關的分庫。。Spock Proxy。HiveDB