電商系統中的靜態頁解決方案

概述

靜態頁面生成是經常使用的提高性能手段,將一些高併發、變化頻率低、對延遲容忍度高的頁面生爲靜態頁面,在電商場景中首頁、商品詳情頁、幫助中心頁、專題頁都是符合特徵的頁面。經過生成靜態頁直接輸出給瀏覽器,可以有效的減小數據庫及cpu的負載。html

通常說來,靜態頁的生成和展現有以下幾個裝置:前端

  • 頁面生成裝置
  • 頁面寫入裝置
  • 頁面存儲裝置
  • 頁面讀取裝置
  • 頁面顯示裝置

 

 

整體分爲三大類:頁面的生成,頁面的存儲和頁面的讀取,其難點分析以下:vue

注:本文均以javashop電商系統中的解決方案爲例java

 

難點與解決方案

頁面生成難點node

 1、SEO問題nginx

頁面的生成方案多是多樣的,主要是看是否採用了先後端分離的設計,若是採用了先後端分離,若是直接使用前端框架的源碼會存在seo失效的問題,由於數據是rest api返回的,前端框架o(如vue)須要將這些數據在瀏覽器中渲染後纔會造成用戶能看到的效果,而對於seo的爬蟲來說,他不會執行vue的渲染過程,因此seo爬蟲看到的是沒有數據填充的html代碼,致使seo幾無效。redis

在javashop電商系統的7.0版本中已經採用了先後端分離技術,相應的解決方案是採用nodejs的服務器端渲染,網頁生成裝置經過httpclient先去nodejs服務中抓取vue渲染過的html(已經填充好數據 了),再存入存儲裝置。數據庫

在javashop電商系統的6.x版本中沒有先後端分離技術,頁面生成是經過freemarker解析模板來生成的,沒有seo問題,這和常見的生成沒有什麼區別,在這裏再也不贅述。後端

2、頁面同步api

當頁面內容發生變化時,相應的頁面生成裝置要被觸發,javashop電商系統中在相應業務中有比較齊全的異步消息發送,好比商品信息的變動,首頁樓層的變化等(javashop使用的是rabbitmq),在頁面生成模塊中對這些消息作了響應,觸發相應的頁面生成動做。

 頁面存儲的分佈式難點

頁面存儲有多種選擇如硬盤、內存、緩存甚至雲端。若是採用硬盤或內存都存在分發和更新的一致性問題,綜合考慮,javashop電商系統中採用的Redis緩存作存儲頁面方案。

頁面讀取高併發難點

在由Redis中讀取時,能夠選擇經過java讀取經過tomcat等輸出給瀏覽器,這種方式大可能是要再由nginx等代理輸出,中間層較多,對於併發優化,參數調優要求也就太高。

javashop電商系統中採用nginx+lua腳本直接讀取redis並輸出的方案,這樣減小了中間層,還能夠在Nginx中作本地緩存提升性能。

 

 

頁面展現動靜結合

在電商場景中,商品詳細頁面中庫存數據是有時時性要求的,且是高併發的。javashop在商品詳細靜態頁中會經過異步請求庫存api來時時獲取庫存,爲了提供較高的併發能力,庫存是存儲在redis中的。

 

 

 

頁面中其它時時數據,如會話狀態、購物車bar等均可以經過此方案來解決。

以上是基於Javashop7.0電商系統中靜態頁架構總的一套生成及顯示方案,在具體實現細節中還要注意緩存可能被穿透、lua鏈接池、頁面壓縮(redis傳輸的包過大會大幅下降性能)、nginx參數優化等問題。

固然在不一樣的業務場景下實現的方案是多種多樣的,僅以此方案拋磚引玉,供你們參考。

易族智匯(javashop)原創文章 

相關文章
相關標籤/搜索