一個大型的B2B或者B2C網(wǎng)站,必然要考慮訪問用戶量和站點自身的內(nèi)容量問題,如果解決高訪問量和海量內(nèi)容帶來的性能問題呢。當(dāng)然對于非常成熟的企業(yè)來說可以采用分布式數(shù)據(jù)庫和服務(wù)器,通過負(fù)載均衡同樣能解決問題。而我們采用的是最簡單、最容易、成本最低的實現(xiàn)方式,那就是使用靜態(tài)鏡像站點。
服務(wù)器一:阿里云服務(wù)器(原站點)
服務(wù)器二:阿里云OSS存儲服務(wù)(鏡像站點)
配置鏡像站點映射到云服務(wù)器,云服務(wù)器的每個頁面的訪問會生成靜態(tài)頁面,當(dāng)靜態(tài)頁面存在時,則直接讀取靜態(tài)頁面,若靜態(tài)頁面不存在則動態(tài)生成。
那么問題來了,當(dāng)網(wǎng)站內(nèi)容有更新時,但頁面靜態(tài)文件已經(jīng)存在的時候,用戶訪問時get到的永遠(yuǎn)是已經(jīng)生成的那個靜態(tài)文件,而無法讀取到最新的頁面內(nèi)容。
也許你會說這個很簡單,定時將舊的靜態(tài)文件刪除了不就好了嘛。沒錯,一開始本君也是這樣做的,但很快就發(fā)現(xiàn)有問題,這樣做行不通了。
問題一:定時清除所有靜態(tài)文件,那么新的靜態(tài)文件生成的期間,用戶訪問量若大,則性能問題一樣會出現(xiàn)
問題二:網(wǎng)站海量的內(nèi)容,生成靜態(tài)文件不是一時半刻就能完成的,單個服務(wù)器能承受的并發(fā)很底,幾十萬個靜態(tài)頁面都要好幾天才能生成完
問題三:最頭痛的是阿里OSS存儲服務(wù)器讀取原站點的頁面只有3s的響應(yīng)時間,如果頁面響應(yīng)時間久了一點,則會出現(xiàn)文件找不到的錯誤。
接下來本君要說重點了,我們可以采用主動推送方式,具體如下:
1. 定義一張路由表,記錄網(wǎng)站各頁面的路由地址配置
2. 定義一張路由參數(shù)表,記錄參數(shù)名稱以及參數(shù)值讀取的sql,sql支持指定時間點查詢
3. 定義一張靜態(tài)頁面生成歷史記錄表。記錄每個具體的頁面url、路由名稱、存儲oss站點、頁面生成狀態(tài)、頁面生成內(nèi)容、生成時間
實現(xiàn)一個服務(wù),每5分鐘執(zhí)行一次,讀取路由參數(shù)表,并執(zhí)行相應(yīng)的sql,同樣sql參數(shù)指定時間點為5分鐘內(nèi)。將sql執(zhí)行讀取到的參數(shù)與路由的url組合成一組具體的url,比較參數(shù)更新時間和歷史記錄生成的時間,若參數(shù)更新時間晚于html生成時間,則將記錄插入到歷史記錄表標(biāo)記狀態(tài)為未請求。
同時每次任務(wù)執(zhí)行讀取指定條數(shù)未請求的記錄,開始構(gòu)造H