大型互联网网站架构心得之二:并、换和其它(转)
上次說(shuō)的“分”是一個(gè)比較大的原則也是一個(gè)比較高層的原則,這次我想說(shuō)一下其它兩個(gè)原則:并與換。
?
并
?
為什么要分?是因?yàn)槲覀兿Mㄟ^(guò)分來(lái)提高系統(tǒng)的承載能力,那并又是并什么呢?我想了一下有幾個(gè)方面可以并:
?
1.???????合并用戶請(qǐng)求,最基本的就是合并CSS/圖片/腳本,還可以合并頁(yè)面。不過(guò)合并就可能產(chǎn)生流量的浪費(fèi),需要有一個(gè)平衡點(diǎn)。
2.???????合并接口的粒度,如果做分布式應(yīng)用的話,我們可能不會(huì)直接訪問(wèn)數(shù)據(jù)庫(kù)而是調(diào)用應(yīng)用層提供的接口,由于是網(wǎng)絡(luò)調(diào)用,代價(jià)比較大,因此在設(shè)計(jì)的時(shí)候盡量提供粒度比較粗的接口,一次調(diào)用返回比較多的數(shù)據(jù),而不是細(xì)化到添加刪除修改的層次。
3.???????合并接口的部署,對(duì)于頻繁的跨機(jī)器調(diào)用可以考慮有一些數(shù)據(jù)冗余,把跨網(wǎng)絡(luò)的服務(wù)編程進(jìn)程間通訊,甚至轉(zhuǎn)到客戶端來(lái)做。比如論壇發(fā)貼時(shí)候臟詞的過(guò)濾,直接調(diào)用應(yīng)用層提供的接口(跨機(jī)器)是可以的,但是可能代價(jià)比較大,可以把這個(gè)接口使用IPC方式部署在本機(jī)。
?
換
?
時(shí)間換空間,空間換時(shí)間是常見(jiàn)的做法,具體一點(diǎn)說(shuō):
?
1.???????緩存。緩存的重要性早計(jì)算機(jī)的硬件中就有重要的體現(xiàn)。對(duì)于網(wǎng)站,有很多種緩存,可以是客戶端資源的緩存,可以是頁(yè)面輸出緩存,也可以是應(yīng)用層的數(shù)據(jù)緩存,目的都是一樣的,或是減少了服務(wù)器請(qǐng)求次數(shù),或是減少了請(qǐng)求的處理過(guò)程,或是減少了數(shù)據(jù)庫(kù)的訪問(wèn)次數(shù)。當(dāng)然,生成靜態(tài)文件也可以算是一種緩存。不訪問(wèn)磁盤(pán)固然不可能,但是我們要極大限度降低磁盤(pán)訪問(wèn)的機(jī)會(huì)。
2.???????有的時(shí)候?yàn)榱双@取極快的響應(yīng),我們還會(huì)不惜代價(jià)采用重復(fù)計(jì)算。比如,我們的某個(gè)操作很可能會(huì)由于網(wǎng)絡(luò)問(wèn)題等原因響應(yīng)比較慢,在設(shè)計(jì)的時(shí)候可以有一個(gè)統(tǒng)一的處理接口,由這個(gè)接口分發(fā)到不同的服務(wù)器去異步實(shí)現(xiàn)這個(gè)操作,哪個(gè)服務(wù)器先返回了結(jié)果我們就用這個(gè)結(jié)果,然后殺死其他服務(wù)器的冗余操作。
3.???????網(wǎng)站一般追求比較快的響應(yīng),一般不太會(huì)在比較高的層次用時(shí)間來(lái)?yè)Q取空間,但是在一些用戶獨(dú)有數(shù)據(jù)的處理算法上可能還是會(huì)考慮到空間的節(jié)省問(wèn)題。
4.???????有的時(shí)候我們會(huì)用一些聚合表來(lái)存放聚合數(shù)據(jù),也就是進(jìn)行一些預(yù)計(jì)算提高復(fù)雜計(jì)算(比如報(bào)表)的性能。當(dāng)然,對(duì)于數(shù)據(jù)分析,構(gòu)建多維數(shù)據(jù)庫(kù)也是一種不錯(cuò)的選擇。
?
有很多網(wǎng)友留言說(shuō)說(shuō)的比較粗,沒(méi)有什么具體的東西。我覺(jué)得架構(gòu)這個(gè)東西很難去說(shuō)具體怎么做,因?yàn)榫唧w實(shí)施的時(shí)候要看情況去應(yīng)用的,由于沒(méi)有完美的東西,所以做架構(gòu)通常是去做一個(gè)平衡,很可能某一個(gè)側(cè)重不同會(huì)影響到架構(gòu)的實(shí)施。希望我的這些文章能給大家一個(gè)提示的作用,看了之后如果你覺(jué)得“這點(diǎn)我倒沒(méi)有考慮到,以后要注意”那或許就是最大的幫助了,下面我想說(shuō)一些其它方面的問(wèn)題,每一條都很零散,算是一個(gè)補(bǔ)充吧:
?
1.???????到底是采用已有的東西還是自己去做需要詳細(xì)考慮的,采用別人的東西可能比較穩(wěn)定,但是自己的控制少了一點(diǎn),采用自己做的東西可以很靈活,但是可能會(huì)問(wèn)題比較多。不管怎么樣,我們?cè)诓捎靡粋€(gè)第三方框架的時(shí)候務(wù)必要進(jìn)行縝密的調(diào)查,看到他的不足,否則項(xiàng)目很可能在后期被這個(gè)框架制約,反之,決定自己去做一個(gè)框架的時(shí)候也要看到自己需要什么其他框架不能提供的東西。
2.???????數(shù)據(jù)傳輸?shù)臅r(shí)候可以做壓縮,但要考慮到壓縮解壓縮需要CPU資源,在IO(磁盤(pán),帶寬,傳輸能力)和CPU之間有一個(gè)平衡的考慮。
3.???????理想的可伸縮性架構(gòu)是可以自由增加或替換服務(wù)器,無(wú)需去停機(jī)維護(hù)或做很大的調(diào)整。在使用一個(gè)統(tǒng)一的調(diào)度中心來(lái)調(diào)度這些服務(wù)器,分配請(qǐng)求的時(shí)候,我們要考慮一下調(diào)度服務(wù)器能承受多少流量。
4.???????使用大量的廉價(jià)服務(wù)器還是少量的高配服務(wù)器?如何根據(jù)需求來(lái)組合服務(wù)器發(fā)揮最大作用。
5.???????對(duì)于分布式構(gòu)架,我們盡量讓每一個(gè)節(jié)點(diǎn)保持簡(jiǎn)單的邏輯,盡量減少同一層次節(jié)點(diǎn)之間的依賴,另外。需要有統(tǒng)一的地方來(lái)管理所有的節(jié)點(diǎn)。
6.???????功能分解、使用異步進(jìn)行整合、故障轉(zhuǎn)移、失效保護(hù)。
7.???????軟件的架構(gòu)升級(jí)和計(jì)算機(jī)硬件的架構(gòu)升級(jí)很像,可能有一段時(shí)期,我們是在慢慢提高整體能力,2年也才提高了幾倍,之后發(fā)現(xiàn)只有通過(guò)某種徹底的架構(gòu)改變才能提高數(shù)十倍的能力,升級(jí)之后,我們或許又會(huì)遇到其他問(wèn)題。就像CPU,是簡(jiǎn)單提高主頻還是徹底更換架構(gòu)。
8.???????數(shù)據(jù)方面,讀寫(xiě)分離、數(shù)據(jù)庫(kù)分隔、功能劃分、緩存、鏡像。
9.???????硬件網(wǎng)絡(luò)上的架構(gòu)很重要,但軟件開(kāi)發(fā)中的一些細(xì)節(jié)不可忽略,好的架構(gòu)不意味著不需要代碼審閱。
posted on 2011-02-28 15:50 dadamoney 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/dadamoney/archive/2011/02/28/1967045.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的大型互联网网站架构心得之二:并、换和其它(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JQuery获取下拉列表框选中项
- 下一篇: 利用JDK工具进行系统性能监测