從架構(gòu)差異看Web高性能開發(fā)
一般情況下,架構(gòu)分兩種來討論的,一種是開發(fā)架構(gòu),一種是部署架構(gòu)
部署架構(gòu),就是開發(fā)完的程序在實際運行環(huán)境下,通過負(fù)載均衡,DNS輪詢,SquID等等來減輕單臺服務(wù)器負(fù)載,達(dá)到性能優(yōu)化的目的
這里大家估計更想了解的是開發(fā)上的架構(gòu)
我對這個的觀點是,所有的架構(gòu)都是死的,而Web高性能開發(fā)優(yōu)化策略是活的,我在開發(fā)中,所有的東西都不是一定要按照什么固定的模式,去死開發(fā),更多的是針對需要優(yōu)化的信息進(jìn)行針對處理,下面說說我的優(yōu)化策略
1、數(shù)據(jù)庫優(yōu)化,這個是所有的優(yōu)化策略中中重要的,可以說數(shù)據(jù)庫設(shè)計的好壞,直接影響了一個系統(tǒng)的承受力。普通的數(shù)據(jù)庫細(xì)節(jié)優(yōu)化,網(wǎng)上已經(jīng)有大筆文章了,沒什么好說的,想了解的自己去找。而我要說的就是在數(shù)據(jù)庫設(shè)計中的一個思路,分庫、分表、緩存表。
1)分庫指的是在設(shè)計中,要考慮到后期數(shù)據(jù)量大的情況下,你的數(shù)據(jù)庫能夠隨著應(yīng)用隨時拆分,這個拆分并不是只是針對功能模塊對應(yīng)的數(shù)據(jù)拆分。舉個例子,就 用這個CSDN論壇吧,比如里面有很多類,C#版,JAVA版,系統(tǒng)設(shè)計版等等,拆分的目的是可以把任何一個版的數(shù)據(jù)拆分到單獨的一個數(shù)據(jù)庫中去。
2)分表相對的就好理解了,就是說同類型的數(shù)據(jù),你可以為了性能優(yōu)化,進(jìn)行拆分到多個表中去,拆分規(guī)則可以有多種,按照類型、按照時間、按照姓名等等。同樣以這個CSDN論壇來說,我要設(shè)計的話,我會按照里面的大版面進(jìn)行數(shù)據(jù)庫拆分,而按照小版,進(jìn)行表拆分。
3)而對于緩存表,網(wǎng)上我還很少看到有人來說這個東西,這個的目的就是針對一個大的數(shù)據(jù)表中,一般中有死數(shù)據(jù)庫和活動數(shù)據(jù),比如用戶表,里面有很多基本不 來的用戶,那么針對這樣的情況,當(dāng)表數(shù)據(jù)上了千萬的時候,我就會采用緩存表的模式來進(jìn)行了,就是在實際表和用戶之間在搭建一個臨時表,訪問用戶數(shù)據(jù)時,首 先訪問臨時表,如果不存在,則進(jìn)入實際表中獲取,然后放入緩存表中,同時會通過后臺線程,定時將緩存表數(shù)據(jù)同步到實際數(shù)據(jù)庫中,同步時間可以針對系統(tǒng)要求 來進(jìn)行。
如果理解了上面的東西,那么在數(shù)據(jù)承載上,可以上升一個很大的層次。。。。。
2、程序優(yōu)化。這個對我來說相對的就不是那么的看中了,程序的優(yōu)化,我更多的認(rèn)為是個技巧,而不是架構(gòu)了,包括現(xiàn)在經(jīng)常見到的那些各種設(shè)計模式,另外這里提下,很多設(shè)計模式,他的出發(fā)點并不是Web高性能開發(fā),而是考慮的系統(tǒng)擴展性,所以在單個技術(shù)細(xì)節(jié)上,很多人也發(fā)現(xiàn)了,并不如直接的寫代碼來的快,但是就是推薦 那樣,是因為采用了那些模式的程序,擴展性比你的強,那么一旦系統(tǒng)要求變動,或者是要求進(jìn)行拆分的時候要比你方便的多,在分擔(dān)到多個服務(wù)器上時,性能相對 的就起到了優(yōu)化也。廢話了通,繼續(xù)說我對程序部分經(jīng)常采用的方式吧
1) 首推靜態(tài)化,這個的優(yōu)化效果不用多說,直接減輕了服務(wù)器負(fù)擔(dān),不過如果用上了Squid,那么有第三放來做靜態(tài),也可以達(dá)到同樣的效果
2) 合適的數(shù)據(jù)緩存,緩存很多人都用到了,但是在使用前,是否認(rèn)真思考過為這個這個要進(jìn)行Cache,Cache他的標(biāo)準(zhǔn)是什么?我說下我的標(biāo)準(zhǔn):小數(shù)據(jù)量、 大訪問量、更新盡量少的數(shù)據(jù),全部可以進(jìn)行緩存。另外我提到的緩存,并不只是說。NET本身提供的Cache,我說的緩存還包括了使用Static來進(jìn)行 的數(shù)據(jù)
3) 活用線程,很多人的觀念中感覺線程好象在B/S中是用不到的,或者是沒有必要。其實這個觀念完全錯,在特定情況下使用線程,可以提高的局部性能不是一點兩點
4) 功能模塊拆分,這個一般人基本都在做,我要補充的是,不只是在單個項目中進(jìn)行功能模塊的拆分,而是為了進(jìn)行分步式開發(fā)而進(jìn)行拆分
在其它的基本都是細(xì)節(jié)優(yōu)化了,這個沒有太多興趣寫了,網(wǎng)上資料應(yīng)該不少,可以自己搜索查閱
上面的這幾部分如果能在開發(fā)中,靈活運用上,可以說,你實現(xiàn)Web高性能開發(fā),絕對不是難事。
我曾經(jīng)開發(fā)的過的站點中,也有過社區(qū),一個WEB 服務(wù)器,一個DB服務(wù)器,主題帖千萬,回復(fù)帖有6000W左右吧,其它數(shù)據(jù)不算,運行過程中沒出過任何問題,日訪問在100W PV情況下,還沒有達(dá)到性能瓶頸
【編輯推薦】