小型電商網(wǎng)站的頁(yè)面展示采用頁(yè)面全量靜態(tài)化的思想。數(shù)據(jù)庫(kù)中存放了所有的商品信息,頁(yè)面靜態(tài)化系統(tǒng),將數(shù)據(jù)填充進(jìn)靜態(tài)模板中,形成靜態(tài)化頁(yè)面,推入 Nginx 服務(wù)器。用戶瀏覽網(wǎng)站頁(yè)面時(shí),取用一個(gè)已經(jīng)靜態(tài)化好的 html 頁(yè)面,直接返回回去,不涉及任何的業(yè)務(wù)邏輯處理。
下面是頁(yè)面模板的簡(jiǎn)單 Demo 。
<html>
<body>
商品名稱:#{productName}<br>
商品價(jià)格:#{productPrice}<br>
商品描述:#{productDesc}
</body>
</html>
這樣做,好處在于,用戶每次瀏覽一個(gè)頁(yè)面,不需要進(jìn)行任何的跟數(shù)據(jù)庫(kù)的交互邏輯,也不需要執(zhí)行任何的代碼,直接返回一個(gè) html 頁(yè)面就可以了,速度和性能非常高。
對(duì)于小網(wǎng)站,頁(yè)面很少,很實(shí)用,非常簡(jiǎn)單,JAVA 中可以使用 velocity、freemarker、thymeleaf 等等,然后做個(gè) cms 頁(yè)面內(nèi)容管理系統(tǒng),模板變更的時(shí)候,點(diǎn)擊按鈕或者系統(tǒng)自動(dòng)化重新進(jìn)行全量渲染。
壞處在于,僅僅適用于一些小型的網(wǎng)站,比如頁(yè)面的規(guī)模在幾十到幾萬(wàn)不等。對(duì)于一些大型的電商網(wǎng)站,億級(jí)數(shù)量的頁(yè)面,你說你每次頁(yè)面模板修改了,都需要將這么多頁(yè)面全量靜態(tài)化,靠譜嗎?每次渲染花個(gè)好幾天時(shí)間,那你整個(gè)網(wǎng)站就廢掉了。
大型電商網(wǎng)站的商品詳情頁(yè)系統(tǒng)架構(gòu)
大型電商網(wǎng)站商品詳情頁(yè)的系統(tǒng)設(shè)計(jì)中,當(dāng)商品數(shù)據(jù)發(fā)生變更時(shí),會(huì)將變更消息壓入 MQ 消息隊(duì)列中。緩存服務(wù)從消息隊(duì)列中消費(fèi)這條消息時(shí),感知到有數(shù)據(jù)發(fā)生變更,便通過調(diào)用數(shù)據(jù)服務(wù)接口,獲取變更后的數(shù)據(jù),然后將整合好的數(shù)據(jù)推送至 redis 中。Nginx 本地緩存的數(shù)據(jù)是有一定的時(shí)間期限的,比如說 10 分鐘,當(dāng)數(shù)據(jù)過期之后,它就會(huì)從 redis 獲取到最新的緩存數(shù)據(jù),并且緩存到自己本地。
用戶瀏覽網(wǎng)頁(yè)時(shí),動(dòng)態(tài)將 Nginx 本地?cái)?shù)據(jù)渲染到本地 html 模板并返回給用戶。
雖然沒有直接返回 html 頁(yè)面那么快,但是因?yàn)閿?shù)據(jù)在本地緩存,所以也很快,其實(shí)耗費(fèi)的也就是動(dòng)態(tài)渲染一個(gè) html 頁(yè)面的性能。如果 html 模板發(fā)生了變更,不需要將所有的頁(yè)面重新靜態(tài)化,也不需要發(fā)送請(qǐng)求,沒有網(wǎng)絡(luò)請(qǐng)求的開銷,直接將數(shù)據(jù)渲染進(jìn)最新的 html 頁(yè)面模板后響應(yīng)即可。
在這種架構(gòu)下,我們需要保證系統(tǒng)的高可用性。
如果系統(tǒng)訪問量很高,Nginx 本地緩存過期失效了,redis 中的緩存也被 LRU 算法給清理掉了,那么會(huì)有較高的訪問量,從緩存服務(wù)調(diào)用商品服務(wù)。但如果此時(shí)商品服務(wù)的接口發(fā)生故障,調(diào)用出現(xiàn)了延時(shí),緩存服務(wù)全部的線程都被這個(gè)調(diào)用商品服務(wù)接口給耗盡了,每個(gè)線程去調(diào)用商品服務(wù)接口的時(shí)候,都會(huì)卡住很長(zhǎng)時(shí)間,后面大量的請(qǐng)求過來都會(huì)卡在那兒,此時(shí)緩存服務(wù)沒有足夠的線程去調(diào)用其它一些服務(wù)的接口,從而導(dǎo)致整個(gè)大量的商品詳情頁(yè)無(wú)法正常顯示。
這其實(shí)就是一個(gè)商品接口服務(wù)故障導(dǎo)致緩存服務(wù)資源耗盡的現(xiàn)象。






