面試官:你知道什麼是網絡緩存?了解原理嗎?多級緩存架構知道嗎?

2021-03-06 蓮花童子哪吒
引言

隨著一陣陣秋風吹過和一場場秋雨降臨,天氣早以由熱轉涼。在這準備步入嚴寒之際。起早的吒吒輝輝緊緊裹了下被子,鼻子依舊豎立著大鼻涕在那鍵盤上啪啪啪敲打著。想必大家此刻依舊在清晨甜美的夢鄉之中,此刻唯獨我眼角默默的流出了眼淚,只差泣不成聲

都是心酸,都是淚,好了 好了  別被,小吒帶篇了,走著,走著

開篇

繼上篇後,咱們分布式多級緩存的鏈路,將會駛入網絡緩存階段,如果沒看到上文的同學請返回閱讀。

小白:老吒,網絡不都是做請求--響應數據嗎?那裡有緩存?這緩存是幹啥得?我 TM 要這緩存有啥用

吒吒輝:其實不然,可能你使用到了,但對網絡緩存不明確,它滿足什麼條件?實現原理是什麼?什麼場景使用? 架構裡面的代表是什麼?這些都是得作為我暖男的必要條件,必須得給大家安排  (#^.^#)

什麼是網絡緩存?

故名思議,就在請求--響應階段,通過使用緩存來提高請求響應的速度,畢竟只有通信才會涉及到網絡數據的傳輸。

可能有小夥伴會覺得,網絡緩存難道是在網絡上面的緩存?其實不然,看吒吒輝的

試想一個完整HTTP請求。它採用報文的方式發送數據,根據TCP協議來進行數據的傳輸。這個網絡上面有緩存嗎?

那都是通過電信號把咱們數據通過網絡傳輸過去(這是抽象,實體就時光纜等)。這本身就是直線通路的,如果有緩存那就得擁塞啦。就算有,也應該在路由器、交換機上面。

這時,可能又有同學有疑問。在網絡通信上不都有接受數據的網絡緩衝區嗎?用它們來加速的,這不是緩存?

那吒吒輝在就要敲敲黑板啦,緩存和網絡緩衝區是不一樣的,網絡緩衝區是建立在Socket網絡通信基礎之上的。這玩意兒是提高系統每個單元的利用率和系統吞吐量。從而實現多路復用的。和這裡緩存不一樣。

啥,你還不清楚!!後面安排下計算機底層的作業系統原理,你就知道啦。誰叫我是暖男一枚呢(* ̄︶ ̄)

例如:
Redis獲取數據,首先要建立連接,這時的緩衝區是指,客戶端發送Redis指令,首先會先存入自己本地的緩衝區上,然後再通過網卡把數據給整到網絡上。
Redis的服務端也是一樣的,它接受數據首先也會把數據暫存在服務端緩衝區裡面。然後再獲取到Redis服務進行處理。這就是網絡緩衝區,也就是針對數據處理的時候,你首先得放到緩衝區裡面,在進行存取、發送操作。

這一下子,還把我幹懵了,那吒哥,到底什麼是網絡緩存? 咳咳,你往下看

所謂網絡中的緩存,是位於客戶端和服務端之間,通過代理或響應客戶端的網絡請求,從而對重複的請求返回緩存中的數據資源。
同時,接受服務端的請求,更新緩存中的內容。

還不明白?

你這麼看 像HTTP請求一般都需要發送到後端的應用伺服器獲取數據吧,那位於客戶端和應用服務端之間是不是就有web伺服器,也就是Apache、Nginx等。
換句話來說,就是把一些後端的數據存儲在它們上面,從而減少重複請求的響應,因為位於客戶端和服務的網絡通信之間,故此這麼稱呼。

吒吒輝,你看那nginx、Apache整的那麼到位,還不都需要接受網絡請求呀?

這裡你需要明白,你當前HTTP請求的目的是幹嘛?
是要獲取請求的動態數據,所以客戶端與服務端之間的距離都算在它們的網絡通信上,如果中間有個緩存的地方,即可減少網絡響應時間,那就是如下的趕腳:

PHP的請求,客戶端>nginx>php-fpmJAVA的請求,客戶端>Apache>Tomcat

這樣說大家應該明白吧,忽然感覺自己太溫暖啦。累死耕地的牛了

Web代理緩存

Web代理幾乎是伴隨著網際網路誕生的,常用的Web代理分為 正向代理、反向代理和透明代理。Web代理緩存可理解為Web代理+緩存的一種技術。

正向與反向代理,詳情看上篇文章

一般情況下,Web代理默認說的是正向代理, 如下所示。

正向代理

為了從源伺服器取得內容,用戶 向 代理伺服器發送一個請求並指定目標伺服器,然後代理服務向源伺服器轉交請求並將獲得的內容返回給客戶端。一般,客戶端要進行一些特別的設置才能使用正向代理

反向代理

反向代理與正向代理相反,對於客戶端而言代理伺服器就像是源伺服器,並且客戶端不需要進行設置。客戶端向反向代理髮送普通請求,接著反向代理將判斷向何處轉發請求,並將從源伺服器獲得的內容返回給客戶端。

透明代理

透明代理的意思是客戶端根本不需要知道有代理伺服器的存在,由代理伺服器改變客戶端請求的報文欄位,並會傳送真實的IP位址。加密的透明代理屬於匿名代理,不用設置就可以使用代理了。透明代理的例子就是時下很多公司使用的行為管理軟體。
它是介於交換機和防火牆之間的一種設備,用戶的上網行為都會交由它來進行流控、限速、工作網址的屏蔽等操作。

不知道你家公司有這個軟體沒得呢?折磨人

這裡所謂的Web代理緩存是指使用正向代理的緩存技術。Web代理緩存的作用跟瀏覽器的內置緩存類似,只是介於瀏覽器和網際網路之間。簡單點就是把上遊服務的數據,緩存到代理軟體處。

當通過代理伺服器進行網絡訪問時,瀏覽器不是直接到Web伺服器去取回網頁而是向Web代理髮出請求,由代理伺服器來取回瀏覽器所需要的信息並傳送給瀏覽器。

而且,Web代理緩存有很大的存儲空間,不斷將新獲取的數據儲存到本地的存儲器上,如果瀏覽器所請求的數據在Web代理的緩存上已經存在而且是最新的,那麼就不重新從Web伺服器取數據,而是直接將緩存的數據傳送給用戶的瀏覽器,這樣就能顯著提高瀏覽速度和效率。
對於企業而言,使用Web代理既可以節省成本,又能提高性能。

對於Web代理緩存而言,較流行的是Squid,它支持建立複雜的緩存層級結構,擁有詳細的日誌、高性能緩存以及用戶認證支持。Squid同時支持各種插件。
例如:
Squid Guard就是一個提供URL過濾的插件,對於屏蔽某些站點和內容十分有用。如果需要分析Squid的各種指標,可選擇 webalizer 。如果有興趣的話,可以進一步了解一下 Squid 的內部機制。它不僅可以作為正向代理還可以作為反向代理。如下是內部機制工作圖:

Squid 架構工作原理解析Squid 的部署模式:child、sibling、parent。

關係如下:

Child 和 Parent關係(父子級模式):當 Child Squid Server 沒有資料時,會直接向 Parent Squid Server 要資料,然後一直等,直到 Parent 給它資料為止。

父子級模式通信配置簡述

icp_access allow all #開啟所有的icp權限  
cache_peer 192.168.1.50 parent 81 0 no-query originserver weight=1 name=a
cache_peer_domain a www.zhazhahui.com

Sibling 和 Sibling關係(鄰居模式):當 Squid Server 沒有資料時,會先向 Sibling 的 Squid Server 要資料,如果 Sibling 沒資料,就跳過它直接向 Parent 要或上 internet 去拿。也就是多臺機器部署,相互實現通信。

註:關係是通過配置文件來進行指定,各個Squid 服務之間通信關係

icp_access allow all #開啟所有的icp權限
cache_peer 121.9.221.160 parent 80 0 no-query no-digest originserver設置源伺服器
cache_peer 121.9.221.158 sibling 80 3130 #添加icp通訊的sibling鄰居
cache_peer 121.9.221.147 sibling 80 3130 #添加icp通訊的sibling鄰居
cache_peer_access 121.9.221.147 allow all #允許icp通訊的sibling鄰居通訊
cache_peer_access 121.9.221.158 allow all #允許icp通訊的sibling鄰居通訊
cache_peer_domain 121.9.221.160 www.zhazhahui.com #配置本機squid允許接受訪問的域名

那Squid的資料如何拿?首先你得看下它是如何存在?

每一臺Squid 代理伺服器上都有若干顆硬碟,每顆硬碟又分割成多個分區,每一個分區又可建立很多目錄,目錄下存放文件(Squid 把它叫object)。

當 Squid 獲取資料時,會通過查詢表的方式來定位某個資源的位置,所查詢的表叫 Hash table 和 Digest table;

Hash table在這裡可以稱之為目錄或者提綱,它記錄所有的Digest table表信息。Digest table在這裡可以稱之為摘要或者索引,它記錄了磁碟上每個分區,每個目錄裡存的緩存摘要,

Squid 接受到請求後先查詢Hash table,在根據Hash table所指向的Digest table查詢需要的信息。

Squid工作模式

首先 Squid 按照上述模式進行部署,然後客戶端發送請求到 Squid 伺服器,首次磁碟上無緩存數據,直接代理到後端網絡伺服器獲取資源並緩存數據。後續請求直接根據部署的模式在 Squid 上進行內容查找。

邊緣緩存

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

如果反向代理伺服器能夠做到和用戶來自同一個網絡,可以將這樣的反向代理緩存稱為邊緣緩存。因為用戶訪問反向代理伺服器,將會得到更快響應速度。

那如何判斷用戶的網絡和代理伺服器網絡是同一個呢?

客戶端在訪問到服務端時,是通過 智能DNS  規則  來實現就近訪問,就是DNS在解析到客戶端訪問域名的時候,得到伺服器ip,然後拿它與客戶端ip進行比較,如果是同一個ip地址段就採用最近的伺服器來響應客戶端。
簡單點原理就是先在DNS上面做好域名和IP段的映射,然後在對比IP查找,相當於資料庫找數據。

邊緣緩存在網絡上位於靠近用戶的一側,可以處理來自不同用戶的請求,主要用於向用戶提供靜態的內容,以減少應用伺服器的介入。邊緣緩存的一個有名的開源工具就是 Varnish,在默認情況下進行保守緩存。也就是說,Varnish 只緩存它所知的安全內容。Varnish的一個特性是使用虛擬內存,精妙之處在於利用了作業系統的管理機制。Varnish可以高度定製如何處理請求,緩存哪些內容。

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

說到邊緣緩存,那就得就得談談它典型的商業化服務 CDN 了,例如:AWS的Cloud Front,我國的ChinaCache等,現在一般的公有雲服務商都提供了CDN服務。CDN是Content Delivery Network的簡稱,即「內容分發網絡」的意思。使用CDN之後,客戶端與伺服器通信如圖所示。

使用CDN後,客戶端/伺服器的通信方式

CDN邊緣節點的緩存策略因服務商不同而有所變化,但一般都會遵循HTTP標準協議,通過HTTP響應頭中的 Cache-control:max-age 的欄位來設置CDN邊緣節點數據緩存時間。

當你在CDN提供商控制臺添加完加速域名後,會得到一個CDN給您分配的CNAME域名,然後你需要在的DNS解析服務商添加CNAME記錄,將自己的加速域名指向這個CNAME域名,這樣該域名所有的請求才會都將轉向CDN的節點。

客戶端請求通過DNS規則解析後,就會拿到你得到CDN節點地址。客戶端在向CDN節點請求數據時,CDN節點會判斷緩存數據是否過期,若緩存數據並沒有過期,則直接將緩存數據返回給客戶端;否則,CDN節點就會向源站發出回源請求,從源站拉取最新數據,更新本地緩存,並將最新數據返回給客戶端。

CDN服務商一般會提供基於文件後綴、目錄等多個維度來指定在CDN上的緩存時間,為用戶提供更精細化的緩存管理。

CDN回源率的影響因素

若數據在CDN上的緩存時間較短,則CDN邊緣節點上的數據會經常失效,導致頻繁回源,增加了源站的負載,同時也增大了訪問延時;若數據在CDN上的緩存時間太長,會帶來數據更新時間慢的問題。開發者需要針對各自特定的業務,來做特定的數據緩存時間管理。影響CDN緩存條件如下:

源站動態資源較多,多為不可緩存的內容,也會導致頻繁回源拉取。

資源訪問量較低,文件熱度不夠,CDN 收到請求較少無法有效命中緩存。此時緩存內容可能已經過期。

訪問資源的 URL 帶參數,並且參數不斷變化,當用不同的 URL 去訪問 CDN 的時候,CDN 會認為這是一個新請求(即便這兩個不同的 URL 其實是訪問到了同一個文件,並且該文件已經緩存在節點上),也會回源去拉取所請求的內容。

有什麼些方式可及時更新CDN緩存呢?

一般,CDN邊緣節點對開發者來說是透明的,開發者可以通過CDN服務商提供的「刷新緩存」接口來清理位於CDN邊緣節點上的緩存數據。這樣開發者在更新數據後,可以使用「刷新緩存」功能來強制要求CDN邊緣節點上的數據緩存過期,保證客戶端在訪問時,拉取到最新的數據。

除開拉模式,還存在推模式,就是當源數據發生變化後,直接推送給CDN緩存伺服器。常見的就是你在後端控制裡面設置了CDN緩存內容,會自動做更新,後續在繼續分享這個原理內容。

總結網絡緩存本質是減少請求響應之間的網絡時間,也就是常說的正、反向代理。正向代理就是知道應用伺服器所在位置,反向代理不知道,分別對應外與內網應用。CDN的回源影響因素文件緩存時間、URL參數時常變化、訪問量過低、動態源過多等,CDN資源獲取可採用推與拉模式

哈嘍,我是吒吒輝,就愛分析進階相關知識,如果覺得文章對你有幫助,歡迎分享給你的朋友,也給小吒點個「在看」。同時也可入群參加【知識盛宴】,聽說裡面有阿里、順豐等人額。每天一個瓶頸問題,快速迭代成長自己。也可直接回復【知識}獲取知識盛宴pdf

相關焦點

  • 使用Caffeine和springboot的多級緩存配置
    #使用Caffeine和springboot的多級緩存配置因此,在許多應用程式中,包括普通的Spring和Spring Boot,您都可以@Cacheable在任何方法上使用它,並且其結果將被緩存,以便下次調用該方法時,將返回緩存的結果。
  • 蘋果A9三級緩存保持4MB 但改進了架構
    【PConline 資訊】從晶片面積看來,16nm版本的A9三級緩存部分面積為4.5平方毫米,而20nm版本的A8三級緩存面積為4.9平方毫米,考慮到臺積電的16nm在20nm的基礎上改進而來,而A9/A8兩者三級緩存區面積也相仿,則證明A9三級緩存依然保持著A8的4MB,但參數不代表一切,實際性能如何呢?
  • CPU知識科普:主頻、核心、線程、緩存、架構
    下面就帶大家了解一下CPU知識以及怎麼選擇合適的CPU。CPU有幾個重要的參數:主頻、核心、線程、緩存、架構。那麼他們到底是什麼意思,又有啥聯繫呢?鉛錘哥今天就來聊一聊。由於CPU的運算速度特別快,在內存條的讀寫忙不過來的時候,CPU就可以把這部分數據存入緩存中,以此來緩解CPU的運算速度與內存條讀寫速度不匹配的矛盾,所以緩存是越大越好。
  • 那些年與面試官交手過的HTTP問題
    從淡黃的長裙和蓬鬆的頭髮我察覺到,面前坐著的這位女面試官屬實是有點東西。我的自我介紹也變得聲情並茂起來。Skr~~~ 在此期間,小姐姐面無改色的看著我的簡歷。不過無所謂,這些都不重要。還是咱們的原定計劃,把面試官引到了咱們最擅長的領域。你覺得自己最擅長的是什麼?
  • 6年拉力經驗,學了P8架構師的7+1+1落地項目,跳槽阿里年薪40W+
    是因為你都放棄了原先公司的管理崗,放棄了原先的積累,既然來了阿里,就索性待兩年拿到股票再說。所以這種心態在阿里蔓延,主管、hr知道你們不敢走,就玩命用你,不想加班?價值觀問題,股票都打水漂~然後就有很多網友,包括阿里內部程式設計師都覺得這樣很合適呀!
  • 看完這部緩存進化史,還不懂緩存,請給我差評
    隨機淘汰嗎?當然不行,試想一下你剛把A裝載進緩存,下一次要訪問的時候就被淘汰了,那又會訪問我們的資料庫了,那我們要緩存幹嘛呢?所以聰明的人們就發明了幾種淘汰算法,下面列舉下常見的三種FIFO,LRU,LFU(還有一些ARC,MRU感興趣的可以自行搜索):FIFO:先進先出,在這種淘汰算法中,先進入緩存的會先被淘汰。這種可謂是最簡單的了,但是會導致我們命中率很低。
  • OUTLOOK 緩存模式下調整緩存保留時間的滑動塊為什麼是灰色的?
    孔大力的第一反應是,這天煞的騷擾電話也太TMD敬業了吧,它們上班也這麼早嗎?想到這兒,他看都沒看就把電話給掛了。從一數到九,不超過十秒鐘,手機又響了。平時悅耳的鈴聲,此時卻異樣地令人反感,孔大力無奈地接了電話。「喂,哪位?」孔大力有點上火,提高了嗓門喊道。「喂,大力哥嗎?我是彼得啊!我是你老鄉!」
  • 來自未來的緩存 Caffeine,帶你揭開它的神秘面紗
    作者 | Garnett頭圖 | CSDN 下載自東方ICcaffeine是什麼,它和redis什麼區別,有哪些作用,那麼讓我們帶著疑問讓Garnett來告訴你這個來自未來的緩存-Caffeine!Caffeine和Redis的區別是什麼?
  • 程式設計師面試,3個讓你加薪的小技巧!
    ,而是告訴HR你會什麼 很多剛入行的小夥伴特別容易犯的一個錯誤,不清楚面試官到底想問什麼,其實整個面試中面試官並沒有想難倒大家的意思,只是想通過提問的方式來知道你會什麼。 比如: 面試官提問在實際項目中你們是怎麼樣使用緩存的?
  • Mybatis緩存體系結構
    MyBatis 緩存結構由一級緩存和二級緩存構成,這兩級緩存均是使用 Cache 接口的實現類。因此,我將首先會向大家介紹 Cache 幾種實現類的源碼,然後再分析一級和二級緩存的實現。除了緩存之外,Mybatis也定義很多的裝飾器,同樣實現了Cache接口,通過這些裝飾器可以額外實現很多功能。這些緩存是怎麼分類的呢?所有的緩存可以大體歸為三類:基本類緩存、淘汰算法緩存、裝飾器緩存。
  • 985碩,秋招面試30家企業,怒斬阿里、字節、美團offer
    (答錯了,應該是128位)4.md5原理知道嗎?可逆嗎?5.還知道哪些加密算法?(說了對稱加密和非對稱加密)6.哪裡用到了非對稱加密?5.數學建模比賽負責什麼?6.秒殺系統介紹一下?為什麼要引入redis?7.還知道其他緩存嗎?8.memcached和redis區別?9.redis支持多核嗎?
  • Java架構師常見基礎面試題(附答案)
    有很多Java工程師想要把握住這個機會,實現升職加薪、成為Java架構師。但你知道企業在招聘面試時會提問什麼嗎?接下來千鋒廣州Java小編就給大家分享一些基礎面試題答疑。1、什麼是Spring框架?Spring框架有哪些主要模塊?
  • 怎麼才能正確清理電腦的緩存垃圾?
    但實際上,那些緩存文件、註冊列表等並沒有必要過多的清 理,那些緩存文件是可以提高軟體運行速度的。一定程度上能減少你在使用過程中的卡頓感,而且真正需要清 理的垃圾文件,其實你每次重啟電腦就會給你自動清 理,不用太過操心。
  • Redis緩存與NodeJS的初學教程
    雖然它最流行的用例是緩存,Redis還有很多其他用例,你可以利用它的快閃記憶體資料庫的快得驚人。在這個教程中,我們將給你一個快速介紹Redis。我們還將使用Redis為節點應用程式創建一個簡單的緩存,看看它是如何影響其性能的。
  • 字節跳動三面offer到手,面試官都問了些啥?
    原標題:字節跳動三面offer到手,面試官都問了些啥?     前段時間,我一哥們去面試字節跳動,我聽他說過程艱難,但還是費了九牛二虎之力拿下了。     字節跳動的面試挺有挑戰性的感覺,不過還是挺有趣的,感覺啥技術都問。今天就跟大家說說字節跳動的面經。
  • 四面阿里斬獲offer定級P7,2020最新最全阿里巴巴68道高級面試題
    面試:如果不準備充分的面試,完全是浪費時間,更是對自己的不負責。今天給大家分享下我整理的Java架構面試專題及答案(文末見面試答案),其中大部分都是大企業面試常問的面試題,可以對照這查漏補缺,當然了,這裡所列的肯定不可能覆蓋全部方式,不過也希望能對即將找工作的朋友起到一些幫助!
  • 瀏覽器緩存庫設計總結(localStorage/indexedDB)
    你將收穫熟悉瀏覽器緩存的基本過程Web性能優化基本方案以及緩存策略為公司帶來的價值基於localStorage的緩存方案設計以及庫的封裝(vuex/redux數據持久化解決方案),一定要了解瀏覽器緩存的流程,接下來是筆者總結的一個基本的流程圖:上圖展示了一個基本的從瀏覽器請求到展示資源的過程,我們的緩存策略一部分可以從以上流程出發來做優化.我們都知道頁面的緩存狀態是由header決定的,下面具體介紹幾個概念:1.
  • 面試時提問率最高的問題,你知道怎麼回答嗎?
    面試官讓你做自我介紹,不外乎是要考驗你這幾方面:語言表達,現場應變能力;此次面試是否有所準備;了解簡歷上沒有出現的經歷或技能等亮點;對簡歷的真實性做出判斷;所以自我介紹時要做到真實,切記浮誇。面試官多數都具有豐富面試經驗,一旦發現你在編造故事,那麼很大程度上會被pass掉。
  • 面試官是怎麼來考察你對ES搜尋引擎的理解?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫一. 面試官心理分析問這個,其實面試官就是要看看你了解不了解 es 的一些基本原理,因為用 es 無非就是寫入數據,搜索數據。