回顧網站架構演化歷程,當網站遇到性能瓶頸時,第一個想到的解決方案就是使用緩存。在整個網站應用中,緩存幾乎無處不在,既存在于瀏覽器,也存在于應用服務器和數據庫服務器;既可以對數據緩存,也可以對文件緩存,還可以對頁面片段緩存。合理使用緩存,對網站性能優化意義很大。

2、異步操作
使用消息隊列將調用異步化,可改善網站的擴展性。事實上,使用消息隊列還可改善網站系統的性能。
在不使用消息隊列的情況下,用戶的請求數據直接寫入數據庫,在高并發的情況下,會對數據庫造成巨大的壓力,同時也使得響應延遲加劇。在使用消息隊列后,用戶請求的數據發送給消息隊列后立即返回,再由消息隊列的消費者進程從消息隊列中獲取數據,異步寫入數據庫。由于消息隊列服務器處理速度遠快于數據庫(消息隊列服務器也比數據庫具有更好的伸縮性),因此用戶的響應延遲可得到有效改善。
消息隊列具有很好的削峰作用——即通過異步處理,將短時間高并發產生的事務消息存儲在消息隊列中,從而削平高峰期的并發事務。
需要注意的是,由于數據寫入消息隊列后立即返回給用戶,數據在后續的業務校驗、寫數據庫等操作可能失敗,因此在使用消息隊列進行業務異步處理后,需要適當修改業務流程進行配合。
3、使用集群
在網站高并發訪問的場景下,使用負載均衡技術為一個應用構建一個由多臺服務器組成的服務器集群,將并發訪問請求分發到多臺服務器上處理,避免單一服務器因負載壓力過大而響應緩慢,使用戶請求具有更好的響應延遲特性。
4、代碼優化
網站的業務邏輯實現代碼主要部署在應用服務器上,需要處理復雜的并發事務。合理優化業務代碼,可以很好地改善網站性能。不同編程語言的代碼優化手段有很多,這里我們概要地關注比較重要的幾個方面。
4.1、多線程
多用戶并發訪問是網站的基本需求,大型網站的并發用戶數會達到數萬,單臺服務器的并發用戶也會達到數百。CGI編程時代,每個用戶請求都會創建一個獨立的系統進程去處理。由于線程比進程更輕量,更少占用系統資源,切換代價更小,所以目前主要的Web應用服務器都采用多線程的方式響應并發用戶請求,因此網站開發天然就是多線程編程。
4.2、資源復用
系統運行時,要盡量減少那些開銷很大的系統資源的創建和銷毀,比如數據庫連接、網絡通信連接、線程、復雜對象等。從編程角度,資源復用主要有兩種模式:單例和對象池。
4.3、數據結構
早起關于程序的一個定義是,程序就是數據結構 + 算法,數據結構對于編程的重要性不言而喻。在不同場景中合理使用恰當的數據結構,靈活組合各種數據結構改善數據讀寫和計算特性可極大優化程序的性能。
4.4、垃圾回收
如果Web應用運行在JVM等具有垃圾回收功能的環境中,那么垃圾回收可能會對系統的性能特性產生巨大影響。理解垃圾回收機制有助于程序優化和參數調優,以及編寫內存安全的代碼。








