應(yīng)對高并發(fā)訪問的四個建議
A1.jpg
互聯(lián)網(wǎng)不斷擴大的規(guī)模、日益增長的用戶群以及Web2.0的興起,對網(wǎng)站建設(shè)提出了新的要求,它要具備高性能和高可擴展性,同時要支持高度并發(fā)的訪問。將硬盤讀寫分離、功能和展示分開、基本功能封狀成類及在設(shè)計架構(gòu)時保證其擴容性,對大型網(wǎng)站建設(shè)至關(guān)重要。
將硬盤讀寫分離
如果網(wǎng)站硬盤的讀寫性能是整個網(wǎng)站性能提升的瓶頸,那么可考慮將硬盤的讀、寫功能分開,分別進行優(yōu)化。在用來寫的硬盤上,如果我們提升硬盤的I/O,那么肯定會增加整個文件系統(tǒng)的故障率,因為它是所有驅(qū)動器的故障率之和。硬盤的I/O和故障率不能兼得。而用來讀的硬盤,則可用普通的服務(wù)器硬盤來降低開銷。
均衡CPU和I/O消耗,不僅可以獲得更充分的服務(wù)器資源利用,還能支持暫時的過載,遇到突發(fā)事件、訪問流量劇增時,出現(xiàn)的結(jié)果是系統(tǒng)的整體性能下降,而不是立即崩潰。
功能和展示必須分開
在網(wǎng)站的后期運營中,肯定會有很多需求變更。如果每次變更都需要修改源代碼,那么,這個網(wǎng)站的開發(fā)可以說是失敗的。
最重要的是功能和展示必須分開。核心功能使用腳本語言編寫,前臺展示使用帶特殊標簽的HTML,這樣不僅能加快開發(fā)速度,而且會為以后的維護和升級提供方便。對于前臺模板,一般還需要將頁面的頭、尾單獨提取出來,頁面的主體部分也按模塊或功能拆分,這樣能切實減輕服務(wù)器的壓力。
封裝使開發(fā)事半功倍
在功能塊層次,如果使用JSP,應(yīng)將數(shù)據(jù)庫連接、會話管理等基本功能經(jīng)封裝成類。如果使用PHP,則要在腳本代碼中顯式封裝,將每個功能塊封裝成一個函數(shù)、文件或類。
在更高的層次,可以將網(wǎng)站分為表示層、邏輯層和持久層,分別進行封裝,做到當(dāng)某一層架構(gòu)發(fā)生變化時,不會影響到其他層。近來流行的MVC架構(gòu),將整個網(wǎng)站拆分成Model、View和Controller三個部分,而且有很多優(yōu)秀的代碼框架可供選擇使用,像JSP的Structs、Spring,PHP的php.MVC及Studs等。使用現(xiàn)成的代碼框架,可以使網(wǎng)站開發(fā)事半功倍。
擴容性應(yīng)對突增流量
一個大型網(wǎng)站,在設(shè)計架構(gòu)的時候,必須考慮到以后可能的容量擴充。對于活動類網(wǎng)站來說,不定時的突增流量是巨大的。在網(wǎng)站主存儲服務(wù)器上,采用配置文件形式指定每一個存儲盤柜上存儲的數(shù)據(jù)文件的ID范圍。當(dāng)前臺服務(wù)器需要讀取一個數(shù)據(jù)的時候,首先通過詢問主存儲服務(wù)器上的接口獲得該數(shù)據(jù)所在的盤柜及目錄地址,然后再去該盤柜讀取實際的數(shù)據(jù)文件。如果需要增加盤柜,只需要修改配置文件即可,前臺程序絲毫不受影響。