徐漢彬:大規模網站架構的緩存機制和幾何分形學

allowtransparency="true" frameborder="0" scrolling="no" src="http://hits.sinajs.cn/A1/weiboshare.html?url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2014-10-21%2F2822218&type=3&count=&appkey=&title=%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6%E7%AE%80%E5%8D%95%E6%80%BB%E7%BB%93%E5%8F%AF%E4%BB%A5%E8%AF%B4%E6%98%AF%E7%A9%BA%E9%97%B4%E6%8D%A2%E6%97%B6%E9%97%B4%EF%BC%8C%E8%A2%AB%E7%94%A8%E4%BA%8E%E6%8F%90%E5%8D%87%E7%B3%BB%E7%BB%9F%E4%BA%A4%E4%BA%92%E7%9A%84%E6%95%88%E7%8E%87%E3%80%82%E8%80%8C%E6%9C%89%E8%B6%A3%E7%9A%84%E6%98%AF%EF%BC%8C%E8%BF%99%E7%A7%8D%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6%E4%BB%A4%E4%BA%BA%E6%83%8A%E5%A5%87%E5%B9%B6%E4%B8%94%E4%BC%98%E7%BE%8E%E7%9A%84%E9%81%B5%E5%BE%AA%E7%9D%80%E2%80%9C%E5%87%A0%E4%BD%95%E5%88%86%E5%BD%A2%E2%80%9D%E7%9A%84%E8%A7%84%E5%BE%8B%EF%BC%8C%E4%B9%9F%E5%B0%B1%E6%98%AF%E5%87%A0%E4%BD%95%E5%88%86%E5%BD%A2%E5%AD%A6%E4%B8%AD%E7%9A%84%E2%80%9C%E8%87%AA%E7%9B%B8%E4%BC%BC%E6%80%A7%E2%80%9D%E3%80%82&pic=&ralateUid=&language=zh_cn&rnd=1430364053566" width="22" height="16">摘要:緩存機制簡單總結可以說是空間換時間,被用於提升系統交互的效率。而有趣的是,這種緩存機制令人驚奇並且優美的遵循着“幾何分形”的規律,也就是幾何分形學中的“自相似性”。

【導讀】徐漢彬曾在阿里巴巴和騰訊從事4年多的技術研發工作,負責過日請求量過億的Web系統升級與重構,目前在小滿科技創業,從事SaaS服務技術建設。

在過去的工作中,徐漢彬從事各類緩存建設和優化,遇到問題無數,從各種各樣的問題中,逐漸總結出它們之間的“共性”,而這個“共性”又優雅地遵循“幾何分形學”。從幾何分形的角度去看待緩存機制,能夠更容易和更清晰地表述出它的深層原理和部署思想。幫助技術人員去解決在緩存上遇到的技術問題。

PS:在《問底》之後的系列裏,徐漢彬將帶大家探討跨機房熱備份疑難與解析、緩存命中率提高等實踐經驗。

緩存機制和幾何分形學

緩存機制在我們的實際研發工作中,被極其廣泛地應用,通過這些緩存機制來提升系統交互的效率。簡單的總結來說,就是在兩個環節或者系統之間,會引入一個cache/buffer做爲提升整體效率的角色。 

而有趣的是,這種緩存機制令人驚奇並且優美的遵循着“幾何分形”的規律,也就是幾何分形學中的“自相似性”:從整體上看遵循某種組成規律或者特性,同時從每一個局部看,仍然遵循某種組成的規律或者特性。我們的這些系統,從整體上看遵循了緩存機制,每一個組成的局部也遵循緩存機制。 

等同類比的一個概念,我們常常說的“空間換時間”,犧牲一部分空間代價,來換取整體效率的提升。 

 

例如A和B兩者之間的數據交換,爲了提升整體的效率,引入角色C,而C被用於當做熱點數據的存儲,或者是某種中間處理的機制。

我們先從web前端層面開始,看看有哪些比較關鍵的緩存機制?它們又是怎樣協調工作的呢? 

一、前端Cache機制

1. 域名轉爲IP地址(域名服務器DNS緩存)

我們知道域名其實只是一個別名,真實的服務器請求地址,實際上是一個IP地址。獲得IP地址的方式,就是查詢DNS映射表。雖然這是一個非常簡單的查詢, 但如果每次用戶訪問一個url都去查詢DNS一次,未免顯得太頻繁,會產生一個可怕的訪問量級。DNS服務器會告訴你,你別老是經常過來,萬一我掛了,我們就無法愉快地玩耍了。

各個瀏覽器的緩存時間,會有一定的差別。例如,在chrome瀏覽器中查看dns的緩存時間的方式是:chrome://net-internals/#dns。

瀏覽器一般會在本地會建立一個DNS緩存,在一段比較長的時間裏,都是使用本地的緩存映射。例如,在Win7系統的cmd裏,可以通過“ipconfig /flushdns ”的方式來立刻刷新本地DNS。

 

優點:域名映射爲IP非常快。

成本:消耗一定的瀏覽器空間來存儲映射關係

2. 訪問服務器,獲取靜態內容(地理位置分佈式服務CDN)

可能有人會覺得,這個CDN不是緩存。其實,CDN的原理就是將離你很遠的東西,放在離你很近的地方,通過這種方式提高用戶的訪問速度。從這個角度,它也可以理解爲犧牲空間成本換取了時間,本質上也是一種特殊的中間cache。騰訊、阿里等這些大的一線互聯網公司一般傾向於自己建立CDN系統,中小型企業也經常使用第三方的CDN服務。

 

優點:解決用戶離服務器太遠的時候,網絡路由中跳來跳去的嚴重耗時。

成本:全國各地部署多套靜態存儲服務,管理成本比較高,發佈新文件的時候,需要等待全國節點的更新等。

3. 瀏覽器本地緩存(無網絡交互類型)

在前端優化原則中,其中一條就是儘量消滅請求,以達到降低服務器壓力和提升用戶體驗的效果。靜態文件,例如Js、html、css、圖片等內容,很多內容可以1次請求,然後未來就直接訪問本地,不再請求web服務器。

常用的實現方法是通過Http協議頭中的expire和max-age來控制,這兩者的使用方法和區別,我這裏就不贅敘了。還有一種HTML5中很熱的方式,則是localStorage,尤其在移動端也被做爲一個強大的緩存,甚至當做一種本地存儲來廣泛使用。

 

優點:減少網絡傳輸,加快頁面內容展示速度,提升用戶體驗。

成本:佔用客戶端的部分內存和磁盤,影響實時性。

4. 瀏覽器和web服務協議緩存(有網絡交互類型)

瀏覽器的本地緩存是存在過期時間的,一旦過期,就必須重新向服務器請求。這個時候,會有兩種情形:

  • 服務器的文件或者內容沒有更新,可以繼續使用瀏覽器本地緩存。
  • 服務器的文件或者內容已經更新,需要重新請求,通過網絡傳輸新的文件或者內容。

這裏的協商方式也可以通過Http協議來控制,Last-Modified和Etag,這個時候請求服務器,如果是內容沒有發生變更的情況,服務器會返回 304 Not Modified。這樣的話,就不需要每次訪問服務器都通過網絡傳輸一個比較大的文件或者數據包,只要簡單的http應答就可以達到相同的請求文件效果。

 

下圖中的例子,是騰訊的自建CDN(imgcache.gtime.cn): 

 

優點:減少頻繁的網絡大數據包傳輸,節約帶寬,提升用戶體驗。

成本:增加了服務器處理的步驟,消耗更多的CPU資源。

5. 瀏覽器中間代理

上面的幾種cache機制,實際上都是非常常見。但是,在移動互聯網時代,流量昂貴是很多用戶心中深深的痛。於是,又出現了一種新型的中間cache, 也就是在瀏覽器和web服務器再架設一箇中間代理。這個代理服務器會幫助手機瀏覽器去請求web頁面,然後將web頁面進行處理和壓縮(例如壓縮文件和圖片),使頁面變小,然後再傳輸給手機端的瀏覽器。

 

部分手機瀏覽器(例如Chrome)號稱可以節省流量,提升訪問速度,實際上就是上述做法。但是,也分爲兩種情況:

  • 用戶的網絡和手機配置都比較差,因爲頁面被壓縮變小,加載和傳輸速度變快,並且節約了流量。
  • 用戶的網絡和手機配置都比較好,本身直連速度已經很快了,反而因爲設置了中間代理,加載速度變慢,也可節約流量。

下圖是chrome手機瀏覽器中,開啓和不開啓中間代理的對比圖:

 

優點:節約用戶流量,大部分情況下提升了加載速度。

成本:需要架設中間代理服務器,對各種文件進行壓縮,有比較高的服務器維護成本。

6. 預加載緩存機制

這種加載方式主要流行在移動端,爲了解決手機網速慢和瀏覽器加載性能問題,瀏覽器會判斷頁面的關聯內容,進行“預加載”。也就是說,在用戶瀏覽A頁面的時候,就提前下載並且加載B頁面的內容。給用戶的體驗就是,B頁面一瞬間就出現了,中間沒有任何延遲的感覺,從而帶來更好的極佳的用戶體驗。

這種實現機制,往往由瀏覽器來實現,當然,手機頁面本身,也可以通過JS來自身實現。而這種機制也存在一些問題,瀏覽器需要預判用戶的瀏覽行爲,在一些場景下,這個預判算法本身不一定準確,如果不準確則帶來一定的流量、內存和系統資源的浪費。

 

優點:給用戶帶來極佳的頁面展示體驗。

缺點:預判實現比較複雜,佔據一定的內存和手機系統資源,可能產生流量和資源浪費。

前端的cache當然不僅僅如此簡單,如果細緻到每一個小環節和組成部分,我們會發現實際上是無處不在的,例如瀏覽器的渲染行爲、網絡網卡的傳輸環節,小環節和小環節之間也有無數這種類型的cache角色。

這個就如同幾何分形學中的自相似性:從整體上看符合某種組成規律或者特性,同時,從局部看,仍然符合某種組成的規律或者特性。

幾何分形的現象在我們生活中,也是非常常見的,例如:

人體中的幾何分形例子,例如:人體有1個頭部+4肢,局部上看人的手指也是1個手指頭+4個手指;人體無論整體或者局部,都大致遵循黃金分割點0.618的比例來生長(五官按照這個比例越多,越好看)。

例如下圖中的葉子,每個局部都和主幹組成結構相似。

 

二、Web系統和幾何分形學

1. Web系統中的緩存機制

看完上面的前端cache,我們會感覺到緩存機制在前端中的確無處不在,那麼它在其他地方和環節,是否也無處不在?

可以看看這張圖:

 

實際上,每一個環節本身是可以又再次被放大的,放大以後,我們又看見了更多緩存機制的“特性”存在。從一個整體來看,符合該規律,從組成部分來看,仍然符合該規律。

每一個組成緩存機制的“成員”的內部,又存在着更多的緩存機制。

Apache內部的一些“緩存機制”:

  • url映射緩存mod_cache(有mode_disk_cache和mod_mem_cache,後者官方已不推薦)
  • 緩存熱點文件打開描述符mod_file_cache(對於靜態文件的情況,減少打開文件中open行爲的耗時)
  • 啓動的時候,通過prefork模式設置的StartServers服務進程池,犧牲內存空間。

MySQL內的一些“緩存機制”:

  • 數據庫的索引,犧牲磁盤空間(組合索引等會佔據很大的磁盤空間)
  • innodb_buffer_pool_size,熱點數據的緩存,犧牲內存空間
  • innodb_flush_method寫入磁盤的機制,可以配置成緩衝寫入的方式
  • query_cache_size查詢緩存,犧牲內存空間
  • thread_cache_size數據庫連接池的緩存個數,犧牲內存空間

2. 接近硬件層面的“空間換時間”

那我們再來看更細小的一個環節,計算機寫的操作。我們會發現,在內存和物理磁盤之間,還有一個磁盤緩衝區(頁高速緩存)的存在,這個是內存和磁盤之間的“緩存”。當然,讀取的操作也是同理。

下圖是“放大”MySQL中的寫入磁盤:

 

實際上,更進一步看,CPU和內存之間也存在緩存機制(常用指令會存在放在寄存器中,因爲CPU訪問寄存器會遠快於訪問內存,中間爲了緩衝它們之間差距,設置了多級高速緩存)。 

例如下圖是Intel i7 920的各級緩存大小: 

 

這個時候,我們可以看出來,計算機系統從大的系統層面看,是遵循“緩存機制”的規律的,同時,在每個局部成員的層面,同樣遵循該規律。

3. 現實世界中的“緩存機制”

我們現在喝水通常使用的是杯子,杯子實際上也扮演着一個特殊的Cache角色。舉個例子:一個人離飲水機比較遠,他渴了,他有如下兩種“喝水”的方式:

  • 不用杯子,每次渴了直接去飲水機喝(這個比較霸氣側漏,不要在意細節)。結果:頻繁跑動,耗費體力。
  • 使用杯子,渴了先喝杯子(Cache)上的水,如果杯子沒有,帶上杯子去裝水,再喝。結果:比較少跑動,節省體力。

這樣看不直觀,簡化爲一個流程圖如下:

 

這雖然是個人盡皆知的道理,但是,這個方法本身是“進化”出來的。百萬年前的原始人類和其他大自然的動物一樣的,喝水遵循了第一種方式,只是隨着人類的發展,“進化”出第二種喝水的方式。

這裏也存在一個緩存機制,就是用杯子的空間獲取喝水效率的時間。

還有一個更爲典型的例子,就是坐車/運輸,假設我們從深圳去廣州,我們會去坐客運車。而客運車(假設上面有40個座位)實際上相當於一個40個座位的“隊列”。遵循着網絡傳輸的相同的規律“隊列滿或者超時則發送”。客車本身的40個位置,就像一個“發送緩衝區”。使用和不使用這個大的緩衝區,客車也可以有兩者運作方式:

  1. 車站發現來一個人,用只能容納一個人的小車,不等待直接送一個人去廣州。
  2. 車站發現來一個人,先放進客車buffer中,等待人滿或者達到班車約定時間(隊列超時)再出發。

 

顯而易見,第一種是太浪費資源了。

除此之外,還有很多各種各樣的例子,如江河上的大壩、我們桌面上的一些東西(它們佔據寶貴的桌面空間)、我們公司附近小店裏的商品、離我們近的東西等等。

看到這裏,很多人會漸漸發覺,計算機的一些原理,竟然在現實世界裏有無處不在的“映射和影子”。

幾何分形學是個非常有趣的東西,某些規律,實際上還貫穿在整個宏觀和微觀世界中。

例如“繞轉”的現象:

 

4. 現實世界和計算機“緩存機制”原理的關係,爲什麼遵循“幾何分形”?

實際上,計算機的原理來源於數學,而數學是日常生活現象和規律的高度抽象,源於生活,高於生活。

 

同時,不僅僅“緩存機制”,還有多線程等原理,也能找到這種遵循“幾何分形學”的樣子。

“緩存機制”簡單總結可以說是“空間換時間”,我在大學第一天看見這句話的時候,我覺得自己一看見就懂了。隨着對技術理解的加深和工作經驗的積累,我漸漸明白當時我理解得太淺了。

關於作者:徐漢彬,曾經在阿里巴巴和騰訊有過4年的技術研發工作經歷,目前在小滿科技(創業)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章