商品詳情系統(tǒng)是一個(gè)展示商品基本信息、參數(shù)等詳情的系統(tǒng),是商品購買的入口。它是電商平臺(tái)中訪問量最大的系統(tǒng)之一,蘇寧易購大促期間PV量和UV量很大,這么大的訪問量對(duì)系統(tǒng)的并發(fā)能力要求高。在業(yè)務(wù)上它與周邊系統(tǒng)的關(guān)系是高耦合。依賴商品詳情系統(tǒng)的的系統(tǒng)特別多,比如:促銷系統(tǒng)、推薦系統(tǒng)、大聚惠、等眾多營銷系統(tǒng)、還有主數(shù)據(jù)系統(tǒng)、購物車、收藏夾等,業(yè)務(wù)復(fù)雜度高對(duì)系統(tǒng)設(shè)計(jì)提出更多的要求。
(點(diǎn)擊放大圖像)
(點(diǎn)擊放大圖像)
1. 展示
產(chǎn)品上需要設(shè)計(jì)好頁面區(qū)分展示的內(nèi)容
技術(shù)上主要是頁面緩存設(shè)計(jì)、前端頁面模版和JAVA程序的解耦
2. 數(shù)據(jù)處理
數(shù)據(jù)全部來源于其它系統(tǒng),在數(shù)據(jù)上分為:
基本數(shù)據(jù),外部系統(tǒng)傳過來直接就可以使用的數(shù)據(jù)
聚合數(shù)據(jù),需要加工才能使用的數(shù)據(jù)
3. 服務(wù)依賴
通過MQ解耦,異構(gòu)數(shù)據(jù)
解決好以上三個(gè)問題就解決了此系統(tǒng)核心問題。
商品詳情系統(tǒng)在設(shè)計(jì)上分成前、中、后三層結(jié)構(gòu)
頁面設(shè)計(jì):
1. 動(dòng)靜分離
JavaScript、CSS統(tǒng)一放到公共的靜態(tài)服務(wù)器上,完全獨(dú)立的子域名,防止臟Cookie問題和動(dòng)態(tài)域名中無用Cookie問題,通過文件版本號(hào)解決系統(tǒng)新版和舊版本之間沖突問題。
所有圖片由獨(dú)立的分布式圖片系統(tǒng)管理,對(duì)原圖進(jìn)行不同規(guī)格的無損裁減和壓縮。
2. 異步加載和懶加載
商品價(jià)格、營銷活動(dòng)信息、庫存等動(dòng)態(tài)數(shù)據(jù)通過異步加載
非首屏數(shù)據(jù)做懶加載處理,提高首屏加載時(shí)間,比如評(píng)價(jià)、商品詳情等內(nèi)容
3. 多級(jí)緩存策略
a. 瀏覽器本地緩存
協(xié)商緩存,對(duì)于某些時(shí)效要求較高的資源通過Last-modified控制數(shù)據(jù)。做到StatusCode=304
強(qiáng)緩存,JS、CSS等靜態(tài)資源或者一些頁面碎片偽靜態(tài)數(shù)據(jù)通過Expires、Cache-Control(http1.1支持)設(shè)置做到強(qiáng)緩存,在不強(qiáng)制刷新的情況下可以做到200(from cache)
b. CDN緩存
CDN分兩條線有自營CDN和合作商的CDN,圖片、靜態(tài)資源與偽靜態(tài)數(shù)據(jù)分
別放在不到的CDN上
c. Varnish緩存
Varnish在設(shè)計(jì)上負(fù)載使用輪詢方式,不使用URL HASH策略,用空間換時(shí)間的策略, 從而避免熱數(shù)據(jù)問題,也支持橫向擴(kuò)展。
Varnish 緩存和CDN緩存在失效時(shí)間錯(cuò)開,從而避免同時(shí)失效回源壓力過大。
d. 精準(zhǔn)緩存
精準(zhǔn)緩存失效用于促銷活動(dòng)準(zhǔn)時(shí)展示的場景,基于Varnish緩存,通過精準(zhǔn)控制緩存有效期實(shí)現(xiàn)緩存精準(zhǔn)失效保證促銷活動(dòng)準(zhǔn)時(shí)切換。
組件邏輯設(shè)計(jì):
商品詳情系統(tǒng)中的購買按鈕和加入購物車會(huì)因商品不同走不同的流程。如:大聚惠商品、定金團(tuán)商品、預(yù)售商品等因促銷方式不同,走不同的業(yè)務(wù)處理流程。促銷模式變化多端,可能每個(gè)月都會(huì)有變化,通常的面向接口編程和加上工廠方法或者依賴管理框架Spring也很難做到真正的解耦,雖然這樣做已經(jīng)符合開閉原則。我們通過觀察者模式很好的解決了這個(gè)問題。讓前端的頁面模版和JAVA應(yīng)用程序之間真正的解耦。
商品數(shù)據(jù)統(tǒng)一處理設(shè)計(jì)
商品詳情系統(tǒng)商品主數(shù)據(jù)通過MQ消息來源于外部系統(tǒng),比如:商品基本信息、參數(shù)、參數(shù)模版、品牌、品類等。我們?cè)O(shè)計(jì)時(shí)把共性抽出來分成三部分:
解耦分兩塊,系統(tǒng)交互間的解耦和商品詳情系統(tǒng)組件間的解耦以及業(yè)務(wù)流程的解耦
系統(tǒng)間的解耦通過SOA服務(wù)治理來解決,但是由于業(yè)務(wù)的特殊性在服務(wù)治理和性能以及一些其它因素的權(quán)衡中,我們還選擇了一種共享Redis的方式來解決解耦
商品詳情系統(tǒng)組件間解耦以及業(yè)務(wù)流程的解耦
我們使用中規(guī)中矩的部署方式Varnish+Apache+JBoss。
這種架構(gòu)在針對(duì)中小系統(tǒng)沒有什么問題,但像商品詳情系統(tǒng)這種訪問量巨大的系統(tǒng)會(huì)顯的有點(diǎn)吃力。移動(dòng)端對(duì)性能的要求更高。
a. 服務(wù)分離與服務(wù)合并
PC和移動(dòng)端的服務(wù)分離,以前是同一個(gè)接口支持多端,現(xiàn)在是每端都有獨(dú)立的應(yīng)用層服務(wù),原子層服務(wù)共享。
移動(dòng)端處理器和內(nèi)存性能上的限制,采用服務(wù)的合并,且移動(dòng)端用Nginx+Lua。
b. 公共服務(wù)
提出了一個(gè)公共服務(wù),公共服務(wù)用來接受PC、WAP、APP公共的異步請(qǐng)求的服務(wù)。
c.分布式文件系統(tǒng)
商品詳情頁在回源過程中壓力很大,基于其不可降級(jí),我們提出了把商品詳情頁做為一個(gè)靜態(tài)頁放到分布式文件系統(tǒng),當(dāng)DB和Redis壓力過大,直接調(diào)取分布式文件系統(tǒng)中數(shù)據(jù)
多端都使用Nginx+Lua,Nginx 的異步非阻塞型事件處理機(jī)制資源消耗少,并發(fā)能力高。
(點(diǎn)擊放大圖像)
上面介紹了商品詳情系統(tǒng)前、中、后三層邏輯架構(gòu)以及各層的設(shè)計(jì)方法,還介紹了部署架構(gòu)演變,下面是商品詳情系統(tǒng)數(shù)據(jù)流程結(jié)構(gòu)的
1.0版本.
(點(diǎn)擊放大圖像)
這個(gè)結(jié)構(gòu)有兩個(gè)問題:
數(shù)據(jù)異構(gòu)結(jié)果沒有和前端展示關(guān)聯(lián)起來,數(shù)據(jù)變更不能在前端及時(shí)展示
還是沒有解決前端接口依賴問題
2.0版本:
(點(diǎn)擊放大圖像)
把前端分成了三部分:
基礎(chǔ)信息組件 不需要加工的消息、聚合信息組件(需要組合消息或者計(jì)算才能提供服務(wù)的)、實(shí)時(shí)數(shù)據(jù)組件處理對(duì)外部的依賴
數(shù)據(jù)異構(gòu)后會(huì)以MQ形式通知基礎(chǔ)服務(wù),并會(huì)刷新緩存,這種結(jié)構(gòu)后前端與數(shù)據(jù)層無直接依賴。
回源是緩存中最頭痛的問題,隨著系統(tǒng)業(yè)務(wù)復(fù)雜度的上升,很難從整體上把控各種業(yè)務(wù)數(shù)據(jù)在回源時(shí)給一個(gè)系統(tǒng)帶來的壓力,如果回源處理不端在極端情況下會(huì)導(dǎo)致DB壓力瞬間上升,DB不可用或者連接數(shù)滿了等問題,會(huì)發(fā)生以前類似JVM GC回收時(shí)的“stop-the-world”問題。我們回源從被動(dòng)更新緩存數(shù)據(jù)更改為主動(dòng)推送緩存數(shù)據(jù)從根本上解決這問題。
數(shù)據(jù)變更通過listener推送緩存至varnish
(點(diǎn)擊放大圖像)
原來PC端、移動(dòng)端、TV端產(chǎn)品、開發(fā)、測試是分中心分部門,為真正做到多端融合,進(jìn)行組織架構(gòu)融合,產(chǎn)品、開發(fā)、測試合并到一個(gè)中心,統(tǒng)一協(xié)調(diào)。合并后工作效率變高,產(chǎn)品質(zhì)量提升,進(jìn)行小團(tuán)隊(duì)做戰(zhàn)。
展示分離是指在結(jié)合公司業(yè)務(wù)特性、產(chǎn)品自身特性以及降耦合指導(dǎo)思想進(jìn)行PC、WAP、APP端(IOS、ANDROID)、TV端的展示端進(jìn)行分離處理。
邏輯融合分離是指在原子服務(wù)層進(jìn)行融合共享,從服務(wù)單一職責(zé)原則出發(fā)在不同端分別提供獨(dú)立的服務(wù)并加上各自特性,做到接口可擴(kuò)展性和服務(wù)隔離。真正做到一包部署多端使用互不影響,在業(yè)務(wù)可擴(kuò)展性和可維護(hù)性上做到成本最低。
在物理層為了避免多端進(jìn)行資源競爭、相互干擾進(jìn)行獨(dú)立部署
(點(diǎn)擊放大圖像)
聯(lián)系客服