- 深入分布式緩存:從原理到實踐
- 于君澤
- 1885字
- 2019-01-03 15:38:03
1.5 網絡中的緩存
網絡中的緩存位于客戶端和服務端之間,代理或響應客戶端的網絡請求,從而對重復的請求返回緩存中的數據資源。同時,接受服務端的請求,更新緩存中的內容。
1.5.1 Web代理緩存
Web代理幾乎是伴隨著互聯網誕生的,常用的Web代理分為正向代理、反向代理和透明代理。Web代理緩存是將Web代理作為緩存的一種技術。
一般情況下,Web代理默認說的是正向代理,如圖1-7所示。

圖1-7 Web代理
為了從源服務器取得內容,用戶向代理服務器發送一個請求并指定目標服務器,然后代理服務向源服務器轉交請求并將獲得的內容返回給客戶端。一般地,客戶端要進行一些特別的設置才能使用正向代理。
反向代理與正向代理相反,對于客戶端而言代理服務器就像是源服務器,并且客戶端不需要進行設置。客戶端向反向代理發送普通請求,接著反向代理將判斷向何處轉發請求,并將從源服務器獲得的內容返回給客戶端。
透明代理的意思是客戶端根本不需要知道有代理服務器的存在,由代理服務器改變客戶端請求的報文字段,并會傳送真實的IP地址。加密的透明代理屬于匿名代理,不用設置就可以使用代理了。透明代理的例子就是時下很多公司使用的行為管理軟件。
這里的Web代理緩存是指使用正向代理的緩存技術。Web代理緩存的作用跟瀏覽器的內置緩存類似,只是介于瀏覽器和互聯網之間。
當通過代理服務器進行網絡訪問時,瀏覽器不是直接到Web服務器去取回網頁而是向Web代理發出請求,由代理服務器來取回瀏覽器所需要的信息并傳送給瀏覽器。而且,Web代理緩存有很大的存儲空間,不斷將新獲取的數據儲存到本地的存儲器上,如果瀏覽器所請求的數據在Web代理的緩存上已經存在而且是最新的,那么就不重新從Web服務器取數據,而是直接將緩存的數據傳送給用戶的瀏覽器,這樣就能顯著提高瀏覽速度和效率。對于企業而言,使用Web代理既可以節省成本,又能提高性能。
對于Web代理緩存而言,較流行的是Squid,它支持建立復雜的緩存層級結構,擁有詳細的日志、高性能緩存以及用戶認證支持。Squid同時支持各種插件,例如,Squid Guard就是一個提供URL過濾的插件,對于屏蔽某些站點和內容十分有用。如果需要分析Squid的各種指標,webalizer應該是個不錯的選擇。
如果有興趣的話,可以進一步了解一下Squid的內部機制,如圖1-8所示。

圖1-8 Squid的系統架構
1.5.2 邊緣緩存
使用Web反向代理服務器和使用正向代理服務器一樣,可以擁有緩存的作用,反向代理緩存可以緩存原始資源服務器的資源,而不是每次都要向原始資源服務器請求數據,特別是一些靜態的數據,比如圖片和文件,很多Web服務器就具備反向代理的功能,比如大名鼎鼎的Nginx。
如果這些反向代理服務器能夠做到和用戶來自同一個網絡,那么用戶訪問反向代理服務器,就會得到很高質量的響應速度,所以可以將這樣的反向代理緩存稱為邊緣緩存。邊緣緩存在網絡上位于靠近用戶的一側,可以處理來自不同用戶的請求,主要用于向用戶提供靜態的內容,以減少應用服務器的介入。邊緣緩存的一個有名的開源工具就是Varnish,在默認情況下進行保守緩存。也就是說,Varnish只緩存它所知的安全內容。Varnish的一個特性是使用虛擬內存,精妙之處在于利用了操作系統的管理機制。Varnish可以高度定制如何處理請求,緩存哪些內容。
如果感興趣,可以進一步了解Varnish后端的內部機制,如圖1-9所示。

圖1-9 Varnish的后端服務機
邊緣緩存中典型的商業化服務就是CDN了,例如AWS的Cloud Front,我國的ChinaCache等,現在一般的公有云服務商都提供了CDN服務。CDN是Content Delivery Network的簡稱,即“內容分發網絡”的意思。使用CDN之后,客戶端與服務器通信如圖1-10所示。

圖1-10 使用CDN后,客戶端/服務器的通信方式
CDN邊緣節點的緩存策略因服務商不同而有所變化,但一般都會遵循HTTP標準協議,通過HTTP響應頭中的Cache-control: max-age的字段來設置CDN邊緣節點的數據緩存時間。當客戶端向CDN節點請求數據時,CDN節點會判斷緩存數據是否過期,若緩存數據并沒有過期,則直接將緩存數據返回給客戶端;否則,CDN節點就會向源站發出回源請求,從源站拉取最新數據,更新本地緩存,并將最新數據返回給客戶端。
CDN服務商一般會提供基于文件后綴、目錄等多個維度來指定在CDN上的緩存時間,為用戶提供更精細化的緩存管理。CDN上的緩存時間會對“回源率”產生直接的影響。若數據在CDN上的緩存時間較短,則CDN邊緣節點上的數據會經常失效,導致頻繁回源,增加了源站的負載,同時也增大了訪問延時;若數據在CDN上的緩存時間太長,會帶來數據更新時間慢的問題。開發者需要針對各自特定的業務,來做特定的數據緩存時間管理。
一般地,CDN邊緣節點對開發者來說是透明的,開發者可以通過CDN服務商提供的“刷新緩存”接口來清理位于CDN邊緣節點上的緩存數據。這樣開發者在更新數據后,可以使用“刷新緩存”功能來強制要求CDN邊緣節點上的數據緩存過期,保證客戶端在訪問時,拉取到最新的數據。
- Learning SQLite for iOS
- Java程序員面試算法寶典
- Mastering Scientific Computing with R
- 機械工程師Python編程:入門、實戰與進階
- Building Mapping Applications with QGIS
- 面向對象程序設計(Java版)
- 程序員修煉之道:通向務實的最高境界(第2版)
- Python:Master the Art of Design Patterns
- 微信小程序入門指南
- SQL經典實例(第2版)
- 移動界面(Web/App)Photoshop UI設計十全大補
- 編程與類型系統
- MySQL入門很輕松(微課超值版)
- Python3.5從零開始學
- Hands-On Kubernetes on Windows