官术网_书友最值得收藏!

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的系統架構源自http://wiki.squid-cache.org/ProgrammingGuide/Architecture

1.5.2 邊緣緩存

使用Web反向代理服務器和使用正向代理服務器一樣,可以擁有緩存的作用,反向代理緩存可以緩存原始資源服務器的資源,而不是每次都要向原始資源服務器請求數據,特別是一些靜態的數據,比如圖片和文件,很多Web服務器就具備反向代理的功能,比如大名鼎鼎的Nginx。

如果這些反向代理服務器能夠做到和用戶來自同一個網絡,那么用戶訪問反向代理服務器,就會得到很高質量的響應速度,所以可以將這樣的反向代理緩存稱為邊緣緩存。邊緣緩存在網絡上位于靠近用戶的一側,可以處理來自不同用戶的請求,主要用于向用戶提供靜態的內容,以減少應用服務器的介入。邊緣緩存的一個有名的開源工具就是Varnish,在默認情況下進行保守緩存。也就是說,Varnish只緩存它所知的安全內容。Varnish的一個特性是使用虛擬內存,精妙之處在于利用了操作系統的管理機制。Varnish可以高度定制如何處理請求,緩存哪些內容。

如果感興趣,可以進一步了解Varnish后端的內部機制,如圖1-9所示。

圖1-9 Varnish的后端服務機源自https://www.varnish-cache.org/docs/4.1/reference/states.html#backend-side。

邊緣緩存中典型的商業化服務就是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邊緣節點上的數據緩存過期,保證客戶端在訪問時,拉取到最新的數據。

主站蜘蛛池模板: 天等县| 太原市| 祁阳县| 湘乡市| 鲜城| 郑州市| 陆良县| 祁连县| 望城县| 墨玉县| 秦皇岛市| 宝山区| 博白县| 姚安县| 包头市| 阳信县| 梧州市| 金坛市| 平山县| 武功县| 雷山县| 龙州县| 昔阳县| 榆树市| 台中市| 麻江县| 南漳县| 岳阳县| 广州市| 周宁县| 左权县| 汉中市| 平湖市| 新和县| 台山市| 芜湖县| 错那县| 崇义县| 错那县| 旌德县| 西宁市|