IIS+C#+Sql Server,最原始的架構(gòu),直接調(diào)用商品庫(kù)獲取相應(yīng)的數(shù)據(jù),扛不住時(shí)加了一層memcached來(lái)緩存數(shù)據(jù)。這種方式經(jīng)常受到依賴的服務(wù)不穩(wěn)定而導(dǎo)致的性能抖動(dòng)。
該方案使用了靜態(tài)化技術(shù),按照商品維度生成靜態(tài)化HTML。主要思路:
1、通過(guò)MQ得到變更通知;
2、通過(guò)Java Worker調(diào)用多個(gè)依賴系統(tǒng)生成詳情頁(yè)HTML;
3、通過(guò)rsync同步到其他機(jī)器;
4、通過(guò)Nginx直接輸出靜態(tài)頁(yè);
5、接入層負(fù)責(zé)負(fù)載均衡。
該方案的主要缺點(diǎn):
1、假設(shè)只有分類(lèi)、面包屑變更了,那么所有相關(guān)的商品都要重刷;
2、隨著商品數(shù)量的增加,rsync會(huì)成為瓶頸;
3、無(wú)法迅速響應(yīng)一些頁(yè)面需求變更,大部分都是通過(guò)JavaScript動(dòng)態(tài)改頁(yè)面元素。
隨著商品數(shù)量的增加這種架構(gòu)的存儲(chǔ)容量到達(dá)了瓶頸,而且按照商品維度生成整個(gè)頁(yè)面會(huì)存在如分類(lèi)維度變更就要全部刷一遍這個(gè)分類(lèi)下所有信息的問(wèn)題,因此我們又改造了一版按照尾號(hào)路由到多臺(tái)機(jī)器。
主要思路:
1、容量問(wèn)題通過(guò)按照商品尾號(hào)做路由分散到多臺(tái)機(jī)器,按照自營(yíng)商品單獨(dú)一臺(tái),第三方商品按照尾號(hào)分散到11臺(tái);
2、按維度生成HTML片段(框架、商品介紹、規(guī)格參數(shù)、面包屑、相關(guān)分類(lèi)、店鋪信息),而不是一個(gè)大HTML;
3、通過(guò)Nginx SSI合并片段輸出;
4、接入層負(fù)責(zé)負(fù)載均衡;
5、多機(jī)房部署也無(wú)法通過(guò)rsync同步,而是使用部署多套相同的架構(gòu)來(lái)實(shí)現(xiàn)。
該方案主要缺點(diǎn):
1、碎片文件太多,導(dǎo)致如無(wú)法rsync;
2、機(jī)械盤(pán)做SSI合并時(shí),高并發(fā)時(shí)性能差,此時(shí)我們還沒(méi)有嘗試使用SSD;
3、模板如果要變更,數(shù)億商品需要數(shù)天才能刷完;
4、到達(dá)容量瓶頸時(shí),我們會(huì)刪除一部分靜態(tài)化商品,然后通過(guò)動(dòng)態(tài)渲染輸出,動(dòng)態(tài)渲染系統(tǒng)在高峰時(shí)會(huì)導(dǎo)致依賴系統(tǒng)壓力大,抗不??;
5、還是無(wú)法迅速響應(yīng)一些業(yè)務(wù)需求。
1、之前架構(gòu)的問(wèn)題存在容量問(wèn)題,很快就會(huì)出現(xiàn)無(wú)法全量靜態(tài)化,還是需要?jiǎng)討B(tài)渲染;不過(guò)對(duì)于全量靜態(tài)化可以通過(guò)分布式文件系統(tǒng)解決該問(wèn)題,這種方案沒(méi)有嘗試;
2、最主要的問(wèn)題是隨著業(yè)務(wù)的發(fā)展,無(wú)法滿足迅速變化、還有一些變態(tài)的需求。
我們要解決的問(wèn)題:
1、能迅速響瞬變的需求,和各種變態(tài)需求;
2、支持各種垂直化頁(yè)面改版;
3、頁(yè)面模塊化;
4、AB測(cè)試;
5、高性能、水平擴(kuò)容;
6、多機(jī)房多活、異地多活。
主要思路:
1、數(shù)據(jù)變更還是通過(guò)MQ通知;
2、數(shù)據(jù)異構(gòu)Worker得到通知,然后按照一些維度進(jìn)行數(shù)據(jù)存儲(chǔ),存儲(chǔ)到數(shù)據(jù)異構(gòu)JIMDB集群(JIMDB:Redis+持久化引擎),存儲(chǔ)的數(shù)據(jù)都是未加工的原子化數(shù)據(jù),如商品基本信息、商品擴(kuò)展屬性、商品其他一些相關(guān)信息、商品規(guī)格參數(shù)、分類(lèi)、商家信息等;
3、數(shù)據(jù)異構(gòu)Worker存儲(chǔ)成功后,會(huì)發(fā)送一個(gè)MQ給數(shù)據(jù)同步Worker,數(shù)據(jù)同步Worker也可以叫做數(shù)據(jù)聚合Worker,按照相應(yīng)的維度聚合數(shù)據(jù)存儲(chǔ)到相應(yīng)的JIMDB集群;三個(gè)維度:基本信息(基本信息+擴(kuò)展屬性等的一個(gè)聚合)、商品介紹(PC版、移動(dòng)版)、其他信息(分類(lèi)、商家等維度,數(shù)據(jù)量小,直接Redis存儲(chǔ));
4、前端展示分為兩個(gè):商品詳情頁(yè)和商品介紹,使用Nginx+Lua技術(shù)獲取數(shù)據(jù)并渲染模板輸出。
另外我們目前架構(gòu)的目標(biāo)不僅僅是為商品詳情頁(yè)提供數(shù)據(jù),只要是Key-Value獲取的而非關(guān)系的我們都可以提供服務(wù),我們叫做動(dòng)態(tài)服務(wù)系統(tǒng)。
該動(dòng)態(tài)服務(wù)分為前端和后端,即公網(wǎng)還是內(nèi)網(wǎng),如目前該動(dòng)態(tài)服務(wù)為列表頁(yè)、商品對(duì)比、微信單品頁(yè)、總代等提供相應(yīng)的數(shù)據(jù)來(lái)滿足和支持其業(yè)務(wù)。
更多建議: