記得很多朋友問過我如何構建一個大型的.Net網站.這裡值得討論的問題是----多大 ,公司曾經需要我給他們做一個每天有1000萬人次訪問的門戶網站.而我卻一直都沒有開始動手做...原因很簡單,,做一個這樣的網站,經費少於300萬是不夠的.因此需求分析和啟動資金成為了規劃開始的關鍵.
那麼避開這些不談,,如果現在已經啟動構建.什麼才是一個大型網站需要考慮的呢?
首先值得注意的問題是硬件,如果這麼多人訪問肯定是在全國各地,,那麼在關鍵的網絡通暢的位置放置服務器,和使用信道好的網絡資源成為了必須的條件.這裡想必電信服務商的介紹會比我要積極,所以在此不再贅述.然後,機器的配置也需要一個慎重的考慮,因為ISAPIThreadPool的大小跟機器的性能的關系是很密切的.這裡也不多做介紹.
其次,使用IIS7.0中新加入的特性,,或者使用C/C++編寫一個DLL.控制IIS中的一個輸入請求.使用非托管的擴展和篩選器也是一個不錯的方法.不過在大多數情況下對服務器的改進不會很明顯.尤其是微軟將很多實用的功能放置在相對簡單的操作界面下的情況下更是如此.那麼對於關鍵的ISAPI模塊,想必大家都會問,,如何配置才能發揮WEB服務器的最大效率呢?請大家注意到,HttpExtensionProc函數中的ISAPIThreadPool單元,裡面有一段代碼的意思大致是:則檢查線程池中線程數是否小於最大允許數值(if ThreadCount < FMax then)如果大於等於,線程池不允許再增加,直接返回nil;如果小於,則建立一個新的TISAPIThread實例,並將之加入到線程池中.而操作系統一般會使用默認的最大值.因此我們只需要在IIS中將網站大概配置好,,並且不限制ThreadCount 的最大值,就可以了.
准備工作做完了.大家如果覺得一頭霧水,可以去詳細了解一下CGI的歷史和ISAPI的工作原理.那麼下面進入到.Net部分. 很多網站優化的方案將被再次提起.
- 一個服務中心使用多台服務器.因為分布式運算的算法和特性,決定了在一個服務中心使用多台機器分別進行相關的操作和運算,在最大帶寬允許的范圍內.使機器的效率最大化是一個非常不錯的解決方案.尤其是微軟推出.Net remoting和wcf以後更是顯得特別的使人愉快.
- 一個主網站服務器上使用最簡捷的數據結構進行操作和運算,以及最大的虛擬內存,這樣可以避免因算法上的問題而導致效率低下.並且因為CLR的垃圾回首機制的問題.而必須給機器配置較大的內存容量.
- 在數據庫的構建上必須做出詳細的規劃,盡可能避免因訪問的數據塊過大而造成的資源浪費.數據庫連接池的配置也應盡量做到最好.以下是一個SqlclIEnt配置的例子:
SqlConnection con = new SqlConnection("server=(local);database=&qapos;" + database + "&qapos;;uid=&qapos;" + uid + "&qapos;;pwd=&qapos;" + pwd + "&qapos;;Max Pool Size=100000;Min Pool Size=0;Connection Lifetime=0;packet size=32767;Connection Reset=false; async=true");
- 頁面緩存和Cache:頁面緩存可以通過webconfig文件配置其緩存策略.通過輪詢的方式決定哪些內容應該被緩存在客戶端.而哪些內容可以被服務端更新掉.這樣使得一個面的緩存更加靈活方便.讓人們訪問網站的時候輕松很多.而Cache相較與Application則更加靈活方便.正如.Net之父所說的那樣,偉大的思想並無偉大之處.只是我們付出得更多.我們甚至可以使用雙緩存(Cache)的方法來使網站訪問響應的速度提高一個數量級.
- 異步頁面:我們知道一個http請求在服務端表現為一個線程.而當一個線程在處理一個需長時處理的代碼的時候,客戶端的用戶可不能在這一端發呆.因此我們需要給頁面設置成異步處理,來減少這種不愉快的用戶體驗.使用異步頁面可以使得服務端的線程掛起轉而操作下一個請求,在用戶浏覽的時候再執行上一個掛起的線程.這樣既節省了多余的不必要的請求節約了服務端的資源,又使得用戶體驗更加愉快.真是一舉兩得,,尤其當訪問人數多的時候更是如此.
可見.Net的性能已經是目前所有同類產品中的佼佼者了,呵呵.值得注意的是,人們往往分不清楚哪些部分應該注意得更多,而操作其他部分也許會帶來副作用.那麼只有使用更詳細的軟件規劃計劃,和完美的UML流程才能使得我們前面所做的工作不是白費力氣.強大的大局觀念是一個非常好的幫助,能使你的網站在處理各種情況時都經得住大流量的訪問.好了,值得注意的大的方面我就總結了這麼多.其他細節和編程習慣,以及數據庫的操作規范等小的方面還是靠大家在實際編程中去注意.盡量使用數據庫提供的功能去解決數據庫端的問題,不失為一種明知的方法.小弟不才,因為水平有限請大家多多指出我的錯誤.本人的e-mail:[email protected]希望大家多多指教