大规模网站架构的缓存机制和几何分形学
緩存機(jī)制在我們的實(shí)際研發(fā)工作中,被極其廣泛地應(yīng)用,通過這些緩存機(jī)制來提升系統(tǒng)交互的效率。簡單的總結(jié)來說,就是在兩個(gè)環(huán)節(jié)或者系統(tǒng)之間,會(huì)引入一個(gè)cache/buffer做為提升整體效率的角色。?
而 有趣的是,這種緩存機(jī)制令人驚奇并且優(yōu)美的遵循著“幾何分形”的規(guī)律,也就是幾何分形學(xué)中的“自相似性”:從整體上看遵循某種組成規(guī)律或者特性,同時(shí)從每 一個(gè)局部看,仍然遵循某種組成的規(guī)律或者特性。我們的這些系統(tǒng),從整體上看遵循了緩存機(jī)制,每一個(gè)組成的局部也遵循緩存機(jī)制。
等同類比的一個(gè)概念,我們常常說的“空間換時(shí)間”,犧牲一部分空間代價(jià),來換取整體效率的提升。?
例如A和B兩者之間的數(shù)據(jù)交換,為了提升整體的效率,引入角色C,而C被用于當(dāng)做熱點(diǎn)數(shù)據(jù)的存儲,或者是某種中間處理的機(jī)制。
我們先從web前端層面開始,看看有哪些比較關(guān)鍵的緩存機(jī)制?它們又是怎樣協(xié)調(diào)工作的呢??
一、前端Cache機(jī)制
1. 域名轉(zhuǎn)為IP地址(域名服務(wù)器DNS緩存)
我們知道域名其實(shí)只是一個(gè)別名,真實(shí)的服務(wù)器請求地址,實(shí)際上是一個(gè)IP地址。獲得IP地址的方式,就是查詢DNS映射表。雖然這是一個(gè)非常簡單的查詢, 但如果每次用戶訪問一個(gè)url都去查詢DNS一次,未免顯得太頻繁,會(huì)產(chǎn)生一個(gè)可怕的訪問量級。DNS服務(wù)器會(huì)告訴你,你別老是經(jīng)常過來,萬一我掛了,我們就無法愉快地玩耍了。
各個(gè)瀏覽器的緩存時(shí)間,會(huì)有一定的差別。例如,在chrome瀏覽器中查看dns的緩存時(shí)間的方式是:chrome://net-internals/#dns。
瀏覽器一般會(huì)在本地會(huì)建立一個(gè)DNS緩存,在一段比較長的時(shí)間里,都是使用本地的緩存映射。例如,在Win7系統(tǒng)的cmd里,可以通過“ipconfig /flushdns ”的方式來立刻刷新本地DNS。
優(yōu)點(diǎn):域名映射為IP非常快。
成本:消耗一定的瀏覽器空間來存儲映射關(guān)系
2. 訪問服務(wù)器,獲取靜態(tài)內(nèi)容(地理位置分布式服務(wù)CDN)
可能有人會(huì)覺得,這個(gè)CDN不是緩存。其實(shí),CDN的原理就是將離你很遠(yuǎn)的東西,放在離你很近的地方,通過這種方式提高用戶的訪問速度。從這個(gè)角 度,它也可以理解為犧牲空間成本換取了時(shí)間,本質(zhì)上也是一種特殊的中間cache。騰訊、阿里等這些大的一線互聯(lián)網(wǎng)公司一般傾向于自己建立CDN系統(tǒng),中 小型企業(yè)也經(jīng)常使用第三方的CDN服務(wù)。
優(yōu)點(diǎn):解決用戶離服務(wù)器太遠(yuǎn)的時(shí)候,網(wǎng)絡(luò)路由中跳來跳去的嚴(yán)重耗時(shí)。
成本:全國各地部署多套靜態(tài)存儲服務(wù),管理成本比較高,發(fā)布新文件的時(shí)候,需要等待全國節(jié)點(diǎn)的更新等。
3. 瀏覽器本地緩存(無網(wǎng)絡(luò)交互類型)
在前端優(yōu)化原則中,其中一條就是盡量消滅請求,以達(dá)到降低服務(wù)器壓力和提升用戶體驗(yàn)的效果。靜態(tài)文件,例如Js、html、css、圖片等內(nèi)容,很多內(nèi)容可以1次請求,然后未來就直接訪問本地,不再請求web服務(wù)器。
常用的實(shí)現(xiàn)方法是通過Http協(xié)議頭中的expire和max-age來控制,這兩者的使用方法和區(qū)別,我這里就不贅敘了。還有一種HTML5中很熱的方式,則是localStorage,尤其在移動(dòng)端也被做為一個(gè)強(qiáng)大的緩存,甚至當(dāng)做一種本地存儲來廣泛使用。
優(yōu)點(diǎn):減少網(wǎng)絡(luò)傳輸,加快頁面內(nèi)容展示速度,提升用戶體驗(yàn)。
成本:占用客戶端的部分內(nèi)存和磁盤,影響實(shí)時(shí)性。
4. 瀏覽器和web服務(wù)協(xié)議緩存(有網(wǎng)絡(luò)交互類型)
瀏覽器的本地緩存是存在過期時(shí)間的,一旦過期,就必須重新向服務(wù)器請求。這個(gè)時(shí)候,會(huì)有兩種情形:
- 服務(wù)器的文件或者內(nèi)容沒有更新,可以繼續(xù)使用瀏覽器本地緩存。
- 服務(wù)器的文件或者內(nèi)容已經(jīng)更新,需要重新請求,通過網(wǎng)絡(luò)傳輸新的文件或者內(nèi)容。
這里的協(xié)商方式也可以通過Http協(xié)議來控制,Last-Modified和Etag,這個(gè)時(shí)候請求服務(wù)器,如果是內(nèi)容沒有發(fā)生變更的情況,服務(wù)器會(huì)返回 304 Not Modified。這樣的話,就不需要每次訪問服務(wù)器都通過網(wǎng)絡(luò)傳輸一個(gè)比較大的文件或者數(shù)據(jù)包,只要簡單的http應(yīng)答就可以達(dá)到相同的請求文件效果。
下圖中的例子,是騰訊的自建CDN(imgcache.gtime.cn):
優(yōu)點(diǎn):減少頻繁的網(wǎng)絡(luò)大數(shù)據(jù)包傳輸,節(jié)約帶寬,提升用戶體驗(yàn)。
成本:增加了服務(wù)器處理的步驟,消耗更多的CPU資源。
5. 瀏覽器中間代理
上面的幾種cache機(jī)制,實(shí)際上都是非常常見。但是,在移動(dòng)互聯(lián)網(wǎng)時(shí)代,流量昂貴是很多用戶心中深深的痛。于是,又出現(xiàn)了一種新型的中間cache, 也就是在瀏覽器和web服務(wù)器再架設(shè)一個(gè)中間代理。這個(gè)代理服務(wù)器會(huì)幫助手機(jī)瀏覽器去請求web頁面,然后將web頁面進(jìn)行處理和壓縮(例如壓縮文件和圖片),使頁面變小,然后再傳輸給手機(jī)端的瀏覽器。
部分手機(jī)瀏覽器(例如Chrome)號稱可以節(jié)省流量,提升訪問速度,實(shí)際上就是上述做法。但是,也分為兩種情況:
- 用戶的網(wǎng)絡(luò)和手機(jī)配置都比較差,因?yàn)轫撁姹粔嚎s變小,加載和傳輸速度變快,并且節(jié)約了流量。
- 用戶的網(wǎng)絡(luò)和手機(jī)配置都比較好,本身直連速度已經(jīng)很快了,反而因?yàn)樵O(shè)置了中間代理,加載速度變慢,也可節(jié)約流量。
下圖是chrome手機(jī)瀏覽器中,開啟和不開啟中間代理的對比圖:
優(yōu)點(diǎn):節(jié)約用戶流量,大部分情況下提升了加載速度。
成本:需要架設(shè)中間代理服務(wù)器,對各種文件進(jìn)行壓縮,有比較高的服務(wù)器維護(hù)成本。
6. 預(yù)加載緩存機(jī)制
這種加載方式主要流行在移動(dòng)端,為了解決手機(jī)網(wǎng)速慢和瀏覽器加載性能問題,瀏覽器會(huì)判斷頁面的關(guān)聯(lián)內(nèi)容,進(jìn)行“預(yù)加載”。 也就是說,在用戶瀏覽A頁面的時(shí)候,就提前下載并且加載B頁面的內(nèi)容。給用戶的體驗(yàn)就是,B頁面一瞬間就出現(xiàn)了,中間沒有任何延遲的感覺,從而帶來更好的 極佳的用戶體驗(yàn)。
這種實(shí)現(xiàn)機(jī)制,往往由瀏覽器來實(shí)現(xiàn),當(dāng)然,手機(jī)頁面本身,也可以通過JS來自身實(shí)現(xiàn)。而這種機(jī)制也存在一些問題,瀏覽器需要預(yù)判用戶的瀏覽行為,在一些場景下,這個(gè)預(yù)判算法本身不一定準(zhǔn)確,如果不準(zhǔn)確則帶來一定的流量、內(nèi)存和系統(tǒng)資源的浪費(fèi)。
優(yōu)點(diǎn):給用戶帶來極佳的頁面展示體驗(yàn)。
缺點(diǎn):預(yù)判實(shí)現(xiàn)比較復(fù)雜,占據(jù)一定的內(nèi)存和手機(jī)系統(tǒng)資源,可能產(chǎn)生流量和資源浪費(fèi)。
前端的cache當(dāng)然不僅僅如此簡單,如果細(xì)致到每一個(gè)小環(huán)節(jié)和組成部分,我們會(huì)發(fā)現(xiàn)實(shí)際上是無處不在的,例如瀏覽器的渲染行為、網(wǎng)絡(luò)網(wǎng)卡的傳輸環(huán)節(jié),小環(huán)節(jié)和小環(huán)節(jié)之間也有無數(shù)這種類型的cache角色。
這個(gè)就如同幾何分形學(xué)中的自相似性:從整體上看符合某種組成規(guī)律或者特性,同時(shí),從局部看,仍然符合某種組成的規(guī)律或者特性。
幾何分形的現(xiàn)象在我們生活中,也是非常常見的,例如:
人體中的幾何分形例子,例如:人體有1個(gè)頭部+4肢,局部上看人的手指也是1個(gè)手指頭+4個(gè)手指;人體無論整體或者局部,都大致遵循黃金分割點(diǎn)0.618的比例來生長(五官按照這個(gè)比例越多,越好看)。
例如下圖中的葉子,每個(gè)局部都和主干組成結(jié)構(gòu)相似。
二、Web系統(tǒng)和幾何分形學(xué)
1. Web系統(tǒng)中的緩存機(jī)制
看完上面的前端cache,我們會(huì)感覺到緩存機(jī)制在前端中的確無處不在,那么它在其他地方和環(huán)節(jié),是否也無處不在?
可以看看這張圖:
實(shí)際上,每一個(gè)環(huán)節(jié)本身是可以又再次被放大的,放大以后,我們又看見了更多緩存機(jī)制的“特性”存在。從一個(gè)整體來看,符合該規(guī)律,從組成部分來看,仍然符合該規(guī)律。
每一個(gè)組成緩存機(jī)制的“成員”的內(nèi)部,又存在著更多的緩存機(jī)制。
Apache內(nèi)部的一些“緩存機(jī)制”:
- url映射緩存mod_cache(有mode_disk_cache和mod_mem_cache,后者官方已不推薦)
- 緩存熱點(diǎn)文件打開描述符mod_file_cache(對于靜態(tài)文件的情況,減少打開文件中open行為的耗時(shí))
- 啟動(dòng)的時(shí)候,通過prefork模式設(shè)置的StartServers服務(wù)進(jìn)程池,犧牲內(nèi)存空間。
MySQL內(nèi)的一些“緩存機(jī)制”:
- 數(shù)據(jù)庫的索引,犧牲磁盤空間(組合索引等會(huì)占據(jù)很大的磁盤空間)
- innodb_buffer_pool_size,熱點(diǎn)數(shù)據(jù)的緩存,犧牲內(nèi)存空間
- innodb_flush_method寫入磁盤的機(jī)制,可以配置成緩沖寫入的方式
- query_cache_size查詢緩存,犧牲內(nèi)存空間
- thread_cache_size數(shù)據(jù)庫連接池的緩存?zhèn)€數(shù),犧牲內(nèi)存空間
2. 接近硬件層面的“空間換時(shí)間”
那我們再來看更細(xì)小的一個(gè)環(huán)節(jié),計(jì)算機(jī)寫的操作。我們會(huì)發(fā)現(xiàn),在內(nèi)存和物理磁盤之間,還有一個(gè)磁盤緩沖區(qū)(頁高速緩存)的存在,這個(gè)是內(nèi)存和磁盤之間的“緩存”。當(dāng)然,讀取的操作也是同理。
下圖是“放大”MySQL中的寫入磁盤:
實(shí)際上,更進(jìn)一步看,CPU和內(nèi)存之間也存在緩存機(jī)制(常用指令會(huì)存在放在寄存器中,因?yàn)镃PU訪問寄存器會(huì)遠(yuǎn)快于訪問內(nèi)存,中間為了緩沖它們之間差距,設(shè)置了多級高速緩存)。
例如下圖是Intel i7 920的各級緩存大小:
這個(gè)時(shí)候,我們可以看出來,計(jì)算機(jī)系統(tǒng)從大的系統(tǒng)層面看,是遵循“緩存機(jī)制”的規(guī)律的,同時(shí),在每個(gè)局部成員的層面,同樣遵循該規(guī)律。
3. 現(xiàn)實(shí)世界中的“緩存機(jī)制”
我們現(xiàn)在喝水通常使用的是杯子,杯子實(shí)際上也扮演著一個(gè)特殊的Cache角色。舉個(gè)例子:一個(gè)人離飲水機(jī)比較遠(yuǎn),他渴了,他有如下兩種“喝水”的方式:
- 不用杯子,每次渴了直接去飲水機(jī)喝(這個(gè)比較霸氣側(cè)漏,不要在意細(xì)節(jié))。結(jié)果:頻繁跑動(dòng),耗費(fèi)體力。
- 使用杯子,渴了先喝杯子(Cache)上的水,如果杯子沒有,帶上杯子去裝水,再喝。結(jié)果:比較少跑動(dòng),節(jié)省體力。
這樣看不直觀,簡化為一個(gè)流程圖如下:
這雖然是個(gè)人盡皆知的道理,但是,這個(gè)方法本身是“進(jìn)化”出來的。百萬年前的原始人類和其他大自然的動(dòng)物一樣的,喝水遵循了第一種方式,只是隨著人類的發(fā)展,“進(jìn)化”出第二種喝水的方式。
這里也存在一個(gè)緩存機(jī)制,就是用杯子的空間獲取喝水效率的時(shí)間。
還有一個(gè)更為典型的例子,就是坐車/運(yùn)輸,假設(shè)我們從深圳去廣州,我們會(huì)去坐客運(yùn)車。而客運(yùn)車(假設(shè)上面有40個(gè) 座位)實(shí)際上相當(dāng)于一個(gè)40個(gè)座位的“隊(duì)列”。遵循著網(wǎng)絡(luò)傳輸?shù)南嗤囊?guī)律“隊(duì)列滿或者超時(shí)則發(fā)送”。客車本身的40個(gè)位置,就像一個(gè)“發(fā)送緩沖區(qū)”。使 用和不使用這個(gè)大的緩沖區(qū),客車也可以有兩者運(yùn)作方式:
顯而易見,第一種是太浪費(fèi)資源了。
除此之外,還有很多各種各樣的例子,如江河上的大壩、我們桌面上的一些東西(它們占據(jù)寶貴的桌面空間)、我們公司附近小店里的商品、離我們近的東西等等。
看到這里,很多人會(huì)漸漸發(fā)覺,計(jì)算機(jī)的一些原理,竟然在現(xiàn)實(shí)世界里有無處不在的“映射和影子”。
幾何分形學(xué)是個(gè)非常有趣的東西,某些規(guī)律,實(shí)際上還貫穿在整個(gè)宏觀和微觀世界中。
例如“繞轉(zhuǎn)”的現(xiàn)象:
4. 現(xiàn)實(shí)世界和計(jì)算機(jī)“緩存機(jī)制”原理的關(guān)系,為什么遵循“幾何分形”?
實(shí)際上,計(jì)算機(jī)的原理來源于數(shù)學(xué),而數(shù)學(xué)是日常生活現(xiàn)象和規(guī)律的高度抽象,源于生活,高于生活。
同時(shí),不僅僅“緩存機(jī)制”,還有很多其他技術(shù)的原理,也能找到這種遵循“幾何分形學(xué)”的樣子。
總結(jié)
以上是生活随笔為你收集整理的大规模网站架构的缓存机制和几何分形学的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Android 应用案例开发大全(第3
- 下一篇: HDU6560 The Hermit(思