對於像我這樣的小博客網站來說,日訪問量僅百餘,找個普通的主機託管完全可以滿足需要,實在是不必過多考慮後端的問題。然而,騰訊網易這樣的門戶網站、淘寶這樣的購物交易網站、人人網新浪微博等主要流行的社交網絡應用,則不得不運用多種技術設計後端架構,才能支撐起百萬甚至上億級別的訪問。

這裡我在一個high level例舉我所了解到的提升服務性能的相關技術,其中的每一項都可以展開討論,有空我會專門詳細整理一下和大家探討。

  1. 負載均衡。多核心CPU現在已經廣泛應用,但很多應用程序仍舊採用單進程(線程)的多路復用模型,同一時間只有一個CPU為這個進程(線程)服務,並不能充分發揮CPU的計算能力。我們可以想到的一個方案就是在不修改源碼的條件下,在服務器上運行兩個服務程序的實例(例如數據庫實例),當然這個時候服務端口應該是不同的,然後在其前端放置負載均衡器將流量和連接平均分配到兩個服務端口,可以簡單的通過DNAT來實現負載均衡。提高單個服務器的處理能力終究會達到極限並不是長久之道,並且性價比不高。Google等大型企業都是使用廉價的普通機器組成集群,發揮集群的強大計算能力來提升整體性能。
  2. 鏡像。鏡像技術可以解決因不同網絡接入商和地域帶來的用戶訪問速度差異。例如很多網站在電信和教育網都搭建了鏡像站點,數據實時更新或定點更新,保持同步。這其實也是一個負載均衡的手段,比如利用DNS解析針對不同地區的用戶將域名指向到不同的IP上,讓流量分散至各個不同的服務器。Alteon是一個硬件四層交換產品,價格昂貴但物有所值,能夠提供非常優秀的性能和很靈活的管理能力。在軟件上,也有HAProxy、LVP等解決方案。
  3. 緩存。Apache等服務器都有緩存機制,也可以用外加的Squid模塊進行緩存。我們甚至可以使用內存來代替硬盤存儲數據,從而降低讀盤產生的延遲。Memcached便是一項緩存磁盤數據在主存的技術。
  4. 分離服務。例如將圖片、音頻視頻從主服務器中分離出去,減輕主服務器的壓力。很多大型網站都有獨立的圖片服務器,甚至有多台圖片服務器。而對圖片服務器、音視頻流的處理則可以針對性地使用不同配置更加優化,比如Apache在配置ContentType時盡量少支持LoadModule,保證更高的系統消耗和執行效率。
  5. 數據庫設計。同樣可以將web服務和數據庫服務分離,這也是典型部署方式。使用數據庫集群和對象緩存策略,可以承載較大的訪問量,比如2000用戶,200個並發,百萬級別的數據量。現在業界甚至都在逐漸拋棄關係型數據庫,多使用key-value型NOSQL存儲方案。
  6. 靜態化。動態網頁總是需要耗費更多的資源,例如要查詢數據庫,要即時計算生成頁面等等。而消耗最小的就是純靜態的html頁面,盡量使用靜態頁面這也是提升性能最簡單最有效的手段。可以看到wordpress給每篇文章都分配了一個固定html鏈接,這其實是針對SEO的偽靜態。真正的靜態是像高訪問流量的門戶網站們做的那樣,不是從數據庫中讀取新聞內容,而是真正地自動生成靜態html網頁,這也有利於緩存。對於系統中頻繁使用數據庫查詢但是內容更新很小的應用,就可以考慮使用html靜態化,這樣可以避免大量的數據庫訪問請求。甚至對於社區類型網站來說,儘可能的靜態化也是提高性能的必要手段,將社區內的帖子、文章進行實時的靜態化,有更新的時候再重新靜態化也是大量使用的策略,像Mop大雜燴、網易社區等都是如此。

未完待續。歡迎提供補充。