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