當(dāng)當(dāng)網(wǎng)海量信息的組織與發(fā)布經(jīng)驗(yàn)分享
當(dāng)當(dāng)網(wǎng)自成立以來(lái),內(nèi)部技術(shù)體系的發(fā)展已經(jīng)有15年左右的歷史了。系統(tǒng)架構(gòu)也經(jīng)歷了從高度集成的軟件向分布式、低耦合、SOA化系統(tǒng)的演進(jìn)過(guò)程,形成全面支持網(wǎng)上零售業(yè)各種業(yè)態(tài)模式的系統(tǒng)架構(gòu),每天支撐著千萬(wàn)級(jí)的PV訪問(wèn),承載了超過(guò)100億元人民幣的年?duì)I業(yè)額,2013年雙11峰值流量達(dá)到日常的10倍。
作為一個(gè)典型的自營(yíng)與開(kāi)放平臺(tái)相結(jié)合的網(wǎng)上零售電子商務(wù)平臺(tái),當(dāng)當(dāng)網(wǎng)網(wǎng)上購(gòu)物流程由多達(dá)上百個(gè)大小系統(tǒng)共同實(shí)現(xiàn)。當(dāng)當(dāng)網(wǎng)最終服務(wù)于消費(fèi)者,良好的用戶(hù)體驗(yàn)、錢(qián)物準(zhǔn)確是立足的根本,因此對(duì)系統(tǒng)穩(wěn)定性、可靠性、準(zhǔn)確性有非常嚴(yán)格的要求。任何時(shí)候都能保證線(xiàn)上系統(tǒng)的穩(wěn)定運(yùn)行,是我們工作的第一優(yōu)先級(jí)。電商系統(tǒng)的運(yùn)行峰值通常出現(xiàn)在各類(lèi)促銷(xiāo)、營(yíng)銷(xiāo)活動(dòng)期間,以及大量集中收訂的訂單帶來(lái)很大的生產(chǎn)和配送壓力時(shí)。
除了參加每年的雙11和雙12大促、每年的10月店慶、業(yè)內(nèi)重要的慶典、兩次開(kāi)學(xué)季圖書(shū)大促、換季服裝大促、常規(guī)的新品和尾品大促以外,當(dāng)當(dāng)網(wǎng)每個(gè)月至少會(huì)有一次公司級(jí)別大促,而各種中小型大促常年不斷。各種促銷(xiāo)活動(dòng)均可以閃購(gòu)、秒殺、大量SKU促銷(xiāo)等模式實(shí)現(xiàn)。網(wǎng)站流量的來(lái)源除了新老用戶(hù)的直接登錄以外,還包括多種站外引流方式如網(wǎng)址導(dǎo)航、聯(lián)盟、搜索引擎、各種線(xiàn)上線(xiàn)下媒介、短信、郵件、微信等通道。
因流量來(lái)源的不同,相應(yīng)用戶(hù)的瀏覽、購(gòu)物模式也大有不同。如很多促銷(xiāo)落地頁(yè)是當(dāng)當(dāng)網(wǎng)的“館”,或者專(zhuān)題頁(yè),那么我們可以在活動(dòng)之前做非常有針對(duì)性的準(zhǔn)備;有時(shí)用戶(hù)已提前準(zhǔn)備好了購(gòu)物清單,如雙11這樣的促銷(xiāo)中,訂單轉(zhuǎn)化率會(huì)比平時(shí)高,體現(xiàn)在訂單收訂和賣(mài)場(chǎng)流量不會(huì)成比例上漲——如訂單收訂上漲6倍,賣(mài)場(chǎng)流量可能只會(huì)漲3~4倍;而一些外部引流方式會(huì)帶來(lái)大量無(wú)效、垃圾流量,所以訂單轉(zhuǎn)化率會(huì)比正常流量低。
有的活動(dòng)流量會(huì)對(duì)首頁(yè)有較大影響;有的活動(dòng)會(huì)對(duì)購(gòu)物車(chē)有較大影響,如閃購(gòu)類(lèi)的限時(shí)購(gòu)買(mǎi)或復(fù)雜的促銷(xiāo)邏輯;有的活動(dòng)會(huì)對(duì)當(dāng)當(dāng)網(wǎng)的倉(cāng)儲(chǔ)、配送系統(tǒng)有較大影響,如當(dāng)當(dāng)網(wǎng)配送的訂單;有的活動(dòng)會(huì)對(duì)開(kāi)放平臺(tái)有較大影響,如商家訂單。
因此,摸清業(yè)務(wù)模式和活動(dòng)特點(diǎn),是設(shè)計(jì)和運(yùn)維高峰值電商系統(tǒng),即高伸縮性系統(tǒng)的重中之重。但從另一個(gè)角度來(lái)說(shuō),在沒(méi)有動(dòng)態(tài)彈性部署的前提下,過(guò)度的設(shè)計(jì)和服務(wù)器部署是一種浪費(fèi),特別是硬件非常有限的壽命會(huì)帶來(lái)每年巨大的成本攤銷(xiāo)。
當(dāng)當(dāng)網(wǎng)根據(jù)業(yè)務(wù)發(fā)展速度和業(yè)務(wù)運(yùn)營(yíng)規(guī)律,結(jié)合多年的經(jīng)驗(yàn),制定的系統(tǒng)伸縮性的設(shè)計(jì)原則和硬件常備策略使各流程能夠直接應(yīng)對(duì)日常5倍業(yè)務(wù)量的上漲。通過(guò)增加服務(wù)器的方式,能夠應(yīng)對(duì)10倍業(yè)務(wù)量上漲。而如果要應(yīng)對(duì)10倍以上的上漲,則需要提前做有針對(duì)性的系統(tǒng)優(yōu)化。但無(wú)論當(dāng)前承受的業(yè)務(wù)量是否超過(guò)了設(shè)計(jì)范圍,都不能影響設(shè)計(jì)范圍內(nèi)業(yè)務(wù)量的正常處理。
設(shè)計(jì)和部署大流量、高并發(fā)系統(tǒng)的技術(shù)方案選擇比較多,業(yè)內(nèi)有很多成功經(jīng)驗(yàn)和案例。但根據(jù)我們的經(jīng)驗(yàn),設(shè)計(jì)高峰值的網(wǎng)上零售業(yè)電商應(yīng)用系統(tǒng)通常要面對(duì)以下幾大難點(diǎn)。
應(yīng)用架構(gòu)復(fù)雜,業(yè)務(wù)發(fā)展快,迭代速度快,各系統(tǒng)之間盤(pán)根錯(cuò)節(jié),歷史包袱重。不僅有牽一發(fā)而動(dòng)全身的風(fēng)險(xiǎn),更有邊緣case出錯(cuò)影響主流程處理、耗盡過(guò)多資源的隱患。
從前臺(tái)到后臺(tái)的業(yè)務(wù)流程長(zhǎng),用例多。在能承受的最大峰值上,存在短板效應(yīng)。設(shè)計(jì)實(shí)現(xiàn)時(shí)要面面俱到。
通常促銷(xiāo)活動(dòng)的持續(xù)時(shí)間短而集中,前期推廣活動(dòng)已經(jīng)啟動(dòng),在活動(dòng)期間,短暫的系統(tǒng)不可用,也會(huì)帶來(lái)慘重的銷(xiāo)售損失與負(fù)面影響,沒(méi)有亡羊補(bǔ)牢的機(jī)會(huì)。要確保系統(tǒng)的穩(wěn)定性,平時(shí)的工作就要做足。
針對(duì)這幾大難點(diǎn),有以下幾大應(yīng)對(duì)策略。
基于SOA架構(gòu)理念,降低系統(tǒng)耦合性,接口定義清晰明確,保證獨(dú)立子系統(tǒng)的健壯性高,降低故障跨系統(tǒng)擴(kuò)散風(fēng)險(xiǎn),從而將伸縮性的困難逐步分解到各個(gè)系統(tǒng)。
對(duì)系統(tǒng)進(jìn)行分級(jí),集中力量,突出重點(diǎn)系統(tǒng)。當(dāng)當(dāng)網(wǎng)從賣(mài)場(chǎng)到交易流程均屬于一級(jí)系統(tǒng),這部分系統(tǒng)直接關(guān)乎用戶(hù)體驗(yàn)和訂單量。在系統(tǒng)穩(wěn)定性和可靠性等指標(biāo)上,設(shè)計(jì)標(biāo)準(zhǔn)高于后臺(tái)系統(tǒng)。
優(yōu)先考慮用異步處理代替同步處理,做好系統(tǒng)異常的降級(jí)方案,保證有限的合格服務(wù)。
在描述電商平臺(tái)峰值系統(tǒng)的設(shè)計(jì)之前,通過(guò)下圖可簡(jiǎn)單了解當(dāng)當(dāng)網(wǎng)電商平臺(tái)的幾大組成系統(tǒng):賣(mài)場(chǎng)系統(tǒng),促銷(xiāo)、會(huì)員系統(tǒng),商品管理系統(tǒng),交易系統(tǒng),訂單管理系統(tǒng),倉(cāng)儲(chǔ)與調(diào)撥系統(tǒng),物流與配送系統(tǒng),客服與退換貨系統(tǒng)等。
系統(tǒng)分級(jí)
對(duì)于電商網(wǎng)站,用戶(hù)體驗(yàn)是第一位的,系統(tǒng)穩(wěn)定運(yùn)行是保證用戶(hù)良好體驗(yàn)的基礎(chǔ)。在資源有限的條件下,采取對(duì)系統(tǒng)進(jìn)行級(jí)別劃分的方式,對(duì)高級(jí)別系統(tǒng)保持重點(diǎn)關(guān)注,在設(shè)計(jì)、部署、監(jiān)控等方面確保高級(jí)別系統(tǒng)具備良好的伸縮性、健壯性和敏感度,能夠應(yīng)對(duì)電商業(yè)務(wù)中不確定的極限峰值沖擊。
當(dāng)當(dāng)網(wǎng)基于可能對(duì)用戶(hù)產(chǎn)生影響的程度與敏感度,將所有應(yīng)用系統(tǒng)分為三級(jí),簡(jiǎn)單描述如表。
依此標(biāo)準(zhǔn),當(dāng)當(dāng)網(wǎng)的一級(jí)系統(tǒng)主要包括賣(mài)場(chǎng)系統(tǒng)、商品詳情、價(jià)格系統(tǒng)、庫(kù)存系統(tǒng)、促銷(xiāo)系統(tǒng)、購(gòu)物車(chē)、交易系統(tǒng)、支付系統(tǒng)、會(huì)員系統(tǒng)等。
二級(jí)系統(tǒng)則包括商品信息系統(tǒng)、訂單系統(tǒng)、ERP、倉(cāng)儲(chǔ)系統(tǒng)、物流與干線(xiàn)運(yùn)輸系統(tǒng)等。
三級(jí)系統(tǒng)主要是結(jié)算系統(tǒng)、報(bào)表系統(tǒng),以及運(yùn)營(yíng)、活動(dòng)管理類(lèi)系統(tǒng)。
其中一級(jí)系統(tǒng)基本可分為兩類(lèi),第一類(lèi)為面向用戶(hù)訪問(wèn)的前端頁(yè)面,第二類(lèi)為購(gòu)買(mǎi)流程所涉及的系統(tǒng)。一級(jí)系統(tǒng)的關(guān)鍵指標(biāo)是可用性,在設(shè)計(jì)和部署時(shí)都要高標(biāo)準(zhǔn)嚴(yán)要求,要求具備完善的容錯(cuò)降級(jí)機(jī)制,日常保持較低的系統(tǒng)運(yùn)行負(fù)載,配置高級(jí)別的監(jiān)控告警流程,出現(xiàn)問(wèn)題在要求的SLA標(biāo)準(zhǔn)內(nèi)修復(fù)與解決。這兩類(lèi)系統(tǒng)的核心業(yè)務(wù)功能定位不同,采用的技術(shù)也不同,前端頁(yè)面系統(tǒng)主要使用PHP語(yǔ)言,購(gòu)買(mǎi)流程則主要由Java語(yǔ)言實(shí)現(xiàn)。
前端頁(yè)面系統(tǒng)是電商業(yè)務(wù)的流量入口,需解決的核心問(wèn)題是保證大流量高并發(fā)情況下的快速展示可用,這方面業(yè)界已有較為成熟的解決方案,如CDN、緩存、靜態(tài)化、異步加載、與依賴(lài)的數(shù)據(jù)源解耦、同機(jī)部署、數(shù)據(jù)庫(kù)讀寫(xiě)分離等。通過(guò)這樣的設(shè)計(jì)使前端無(wú)狀態(tài)頁(yè)面應(yīng)用可以水平擴(kuò)展,增加Web服務(wù)器即可提升系統(tǒng)能力。
為充分發(fā)揮系統(tǒng)資源潛力、提高性能,我們引入HHVM對(duì)PHP代碼進(jìn)行優(yōu)化加速,經(jīng)過(guò)性能測(cè)試驗(yàn)證,取得了顯著效果,性能提升超過(guò)100%?,F(xiàn)在當(dāng)當(dāng)網(wǎng)前端頁(yè)面系統(tǒng)具備支撐10倍流量沖擊的能力,面對(duì)超出極限的流量峰值,我們也有預(yù)案,主要采取延長(zhǎng)緩存時(shí)效、本地靜態(tài)化方式,屏蔽峰值流量對(duì)后端系統(tǒng)的沖擊,并具備容錯(cuò)機(jī)制,在后端非關(guān)鍵服務(wù)失效時(shí)優(yōu)雅展示等。賣(mài)場(chǎng)系統(tǒng)作為生成各種活動(dòng)專(zhuān)題頁(yè)面的工廠,支持通過(guò)配置將頁(yè)面組件靜態(tài)化,以滿(mǎn)足更高訪問(wèn)量的要求。
購(gòu)買(mǎi)流程是電商業(yè)務(wù)流程中至關(guān)重要的環(huán)節(jié),一旦出現(xiàn)問(wèn)題,將使前面的引流、促銷(xiāo)、搜索、推薦等營(yíng)銷(xiāo)成果付諸東流,因此購(gòu)物車(chē)、交易系統(tǒng)和支付系統(tǒng)必須確保用戶(hù)購(gòu)買(mǎi)結(jié)算過(guò)程的高效穩(wěn)定,并保證數(shù)據(jù)持久化的準(zhǔn)確性和一致性。
購(gòu)物車(chē)與交易系統(tǒng)邏輯復(fù)雜,依賴(lài)服務(wù)眾多,其中交易流程的實(shí)現(xiàn)依賴(lài)超過(guò)100個(gè)服務(wù)。我們梳理出核心業(yè)務(wù)流程,再根據(jù)與核心業(yè)務(wù)流程的關(guān)系,區(qū)分出對(duì)服務(wù)的依賴(lài)性強(qiáng)弱。弱依賴(lài)服務(wù)如積分、禮券、收藏夾等,通過(guò)較好的容錯(cuò)和降級(jí)機(jī)制,在業(yè)務(wù)量達(dá)到峰值時(shí),可通過(guò)服務(wù)降級(jí)維持核心業(yè)務(wù)流程的穩(wěn)定運(yùn)行。對(duì)于強(qiáng)依賴(lài)服務(wù)中數(shù)據(jù)變化較少的配置查詢(xún)類(lèi)服務(wù),則通過(guò)緩存數(shù)據(jù)來(lái)降低服務(wù)依賴(lài)關(guān)系,犧牲部分?jǐn)?shù)據(jù)的及時(shí)性換取系統(tǒng)的健壯性。
交易型系統(tǒng)的業(yè)務(wù),成功率是關(guān)鍵指標(biāo),可能因?yàn)榉植际椒?wù)集群中部分實(shí)例異?;蚓W(wǎng)絡(luò)問(wèn)題導(dǎo)致調(diào)用強(qiáng)依賴(lài)的服務(wù)失敗,需要發(fā)起重試,為兼顧用戶(hù)體驗(yàn)和減少對(duì)系統(tǒng)資源的占用,采用設(shè)置較短超時(shí)時(shí)間及重試其他服務(wù)節(jié)點(diǎn)方式更為合理。經(jīng)過(guò)優(yōu)化,購(gòu)買(mǎi)流程的系統(tǒng)可用性指標(biāo)達(dá)到了99.99%。
二級(jí)系統(tǒng)多數(shù)為后臺(tái)訂單與履約系統(tǒng)。在流量漏斗模型下,在一級(jí)系統(tǒng)內(nèi)形成訂單后,訂單流轉(zhuǎn)到二級(jí)系統(tǒng),二級(jí)系統(tǒng)面對(duì)的峰值壓力要小得多。
二級(jí)系統(tǒng)多采用異步方式進(jìn)行系統(tǒng)交互,對(duì)于超出處理能力的業(yè)務(wù)數(shù)據(jù),異步機(jī)制削峰填谷,使系統(tǒng)得以在可控的壓力下運(yùn)行。系統(tǒng)資源占用維持在較高水位,既能充分利用系統(tǒng)資源,又可以保證較高的處理效能。當(dāng)然,異步機(jī)制帶來(lái)的延遲問(wèn)題也必須控制在合理范圍之內(nèi),在業(yè)務(wù)量驟增時(shí)可以容忍一定程度延遲。如果平時(shí)就經(jīng)常出現(xiàn)延遲,則需要進(jìn)行優(yōu)化,或者重新進(jìn)行容量規(guī)劃,提高系統(tǒng)整體的吞吐能力。2014年為應(yīng)對(duì)雙11及未來(lái)業(yè)務(wù)發(fā)展,當(dāng)當(dāng)網(wǎng)對(duì)訂單系統(tǒng)數(shù)據(jù)庫(kù)進(jìn)行了擴(kuò)容,規(guī)模達(dá)到之前的5倍,其他部分系統(tǒng)也進(jìn)一步分庫(kù)分表,使之具備承載更高業(yè)務(wù)峰值的能力。
系統(tǒng)分級(jí)是根據(jù)不同系統(tǒng)的特點(diǎn),結(jié)合公司業(yè)務(wù)戰(zhàn)略關(guān)注點(diǎn)進(jìn)行的差異化處理。電商業(yè)務(wù)鏈貫穿多個(gè)系統(tǒng),每一個(gè)環(huán)節(jié)都不容忽視。一級(jí)系統(tǒng)固然是核心優(yōu)化的重點(diǎn),二三級(jí)別系統(tǒng)的技術(shù)指標(biāo)要求也同樣嚴(yán)格。
我們對(duì)每個(gè)系統(tǒng)的可用性都有嚴(yán)格要求,并將監(jiān)控系統(tǒng)列為一級(jí)系統(tǒng),時(shí)刻關(guān)注木桶理論中最短的那塊板子,我們的目標(biāo)是打造一套性能均衡,沒(méi)有明顯短板,日常能夠應(yīng)對(duì)5倍業(yè)務(wù)峰值壓力的電商系統(tǒng)平臺(tái)。
解耦與SOA實(shí)踐
經(jīng)過(guò)多年實(shí)踐,當(dāng)當(dāng)網(wǎng)逐步完成系統(tǒng)架構(gòu)的SOA化改造,并通過(guò)SOA化,實(shí)現(xiàn)了服務(wù)解耦與高內(nèi)聚,簡(jiǎn)化了架構(gòu)復(fù)雜度,這是主流零售型電商平臺(tái)通常選擇的道路。基于分布式的服務(wù)使系統(tǒng)具備更強(qiáng)的伸縮性和擴(kuò)展性,系統(tǒng)瓶頸更易定位和優(yōu)化,滿(mǎn)足業(yè)務(wù)快速增長(zhǎng)的需要。
SOA即面向服務(wù)的架構(gòu),在業(yè)界并沒(méi)有統(tǒng)一的標(biāo)準(zhǔn),但有一些公認(rèn)的設(shè)計(jì)原則:標(biāo)準(zhǔn)合約、松散耦合、服務(wù)抽象、可復(fù)用性、服務(wù)自治、無(wú)狀態(tài)性、可發(fā)現(xiàn)性、可組合性。
在實(shí)際應(yīng)用過(guò)程中,根據(jù)系統(tǒng)情況以其中部分原則為側(cè)重點(diǎn),不求全責(zé)備,簡(jiǎn)單實(shí)用為上。
2012年起,當(dāng)當(dāng)網(wǎng)啟動(dòng)一系列重點(diǎn)項(xiàng)目,首先對(duì)開(kāi)放平臺(tái)進(jìn)行重構(gòu),使開(kāi)放平臺(tái)成為搭建在PIM、庫(kù)存、價(jià)格、促銷(xiāo)、訂單、TMS等主業(yè)務(wù)系統(tǒng)之上一套具備更靈活的擴(kuò)展性的業(yè)務(wù)平臺(tái)。
這次重構(gòu)是當(dāng)當(dāng)網(wǎng)近年的重大架構(gòu)調(diào)整之一,之后各主業(yè)務(wù)系統(tǒng)陸續(xù)實(shí)現(xiàn)業(yè)務(wù)平臺(tái)化,支持多商家甚至是平臺(tái)級(jí)跨商家的業(yè)務(wù)模式。開(kāi)放平臺(tái)將原有獨(dú)立管理的商家商品信息、訂單流程遷移至PIM系統(tǒng)和訂單系統(tǒng)進(jìn)行統(tǒng)一管理,充分發(fā)揮服務(wù)的可復(fù)用性,減少重復(fù)邏輯的多點(diǎn)實(shí)現(xiàn)帶來(lái)的開(kāi)發(fā)和維護(hù)成本。
商品信息是電商業(yè)務(wù)系統(tǒng)中的核心主數(shù)據(jù),是促銷(xiāo)、價(jià)格、庫(kù)存、禮券、搜索等系統(tǒng)的基礎(chǔ)數(shù)據(jù)來(lái)源。PIM系統(tǒng)作為商品主數(shù)據(jù)系統(tǒng),承擔(dān)著管理商品基礎(chǔ)數(shù)據(jù)、關(guān)系、品牌、類(lèi)目和狀態(tài)等信息的職能,商品數(shù)據(jù)量在千萬(wàn)級(jí)別。
PIM系統(tǒng)的SOA建設(shè)經(jīng)過(guò)了兩個(gè)階段。第一階段主要是實(shí)現(xiàn)服務(wù)化,因服務(wù)設(shè)計(jì)粒度過(guò)細(xì),發(fā)布的服務(wù)達(dá)到數(shù)百個(gè),其他系統(tǒng)要完成一個(gè)業(yè)務(wù)功能可能需要調(diào)用多個(gè)PIM服務(wù),增加了服務(wù)使用方的邏輯復(fù)雜度,也帶來(lái)了更多的網(wǎng)絡(luò)交互開(kāi)銷(xiāo),不能稱(chēng)為SOA的最佳實(shí)踐。
為此,又進(jìn)行了第二階段改造,將第一階段實(shí)現(xiàn)的服務(wù)定義為基礎(chǔ)服務(wù),根據(jù)業(yè)務(wù)需要將其組合,提供粗粒度的對(duì)外服務(wù),解決了之前的問(wèn)題。粗粒度服務(wù)能夠提供獨(dú)立的業(yè)務(wù)功能,可能同時(shí)依賴(lài)于多個(gè)系統(tǒng)的基礎(chǔ)服務(wù),當(dāng)服務(wù)使用方因業(yè)務(wù)需要調(diào)用多個(gè)粗粒度服務(wù)時(shí),可能會(huì)對(duì)同一個(gè)基礎(chǔ)服務(wù)發(fā)起多次訪問(wèn),產(chǎn)生疊加的系統(tǒng)壓力。我們經(jīng)過(guò)分析認(rèn)為,底層服務(wù)資源的消耗能夠簡(jiǎn)化上層應(yīng)用邏輯,對(duì)于系統(tǒng)架構(gòu)層次的合理性更為有益,只要提高底層基礎(chǔ)服務(wù)的性能,上層服務(wù)能力將更具彈性。
遵循SOA的系統(tǒng)解耦有時(shí)會(huì)增加系統(tǒng)資源開(kāi)銷(xiāo),甚至降低部分服務(wù)性能指標(biāo),但可使系統(tǒng)架構(gòu)更為清晰,增加服務(wù)復(fù)用性,具備更強(qiáng)的業(yè)務(wù)擴(kuò)展性,提高開(kāi)發(fā)測(cè)試效率,降低開(kāi)發(fā)運(yùn)維的人力成本,及時(shí)響應(yīng)業(yè)務(wù)創(chuàng)新,使IT系統(tǒng)重現(xiàn)活力。
通過(guò)上述系統(tǒng)架構(gòu)治理,當(dāng)當(dāng)網(wǎng)以很少的臨時(shí)性系統(tǒng)準(zhǔn)備順利度過(guò)2013年雙11大促。
海量動(dòng)態(tài)信息流的快速發(fā)布
當(dāng)當(dāng)網(wǎng)打造綜合品類(lèi)電商平臺(tái),開(kāi)放商家入駐,隨之而來(lái)的是商品數(shù)據(jù)量迅速突破千萬(wàn)。商品信息是電商業(yè)務(wù)流程前端的重要數(shù)據(jù),是進(jìn)行營(yíng)銷(xiāo)活動(dòng)、生成訂單的基礎(chǔ)。商品信息在前臺(tái)有多種展示頁(yè)面,大規(guī)模營(yíng)銷(xiāo)活動(dòng)期間運(yùn)營(yíng)人員需要進(jìn)行大量操作設(shè)置,價(jià)格、庫(kù)存等也會(huì)更為頻繁地更新。目前庫(kù)存日更新量峰值超過(guò)1500萬(wàn)SKU的變化;價(jià)格日更新數(shù)據(jù)量達(dá)500萬(wàn)以上SKU,極限峰值超過(guò)1000萬(wàn),每秒可能超過(guò)1萬(wàn)。數(shù)據(jù)同步及時(shí)性、一致性指標(biāo)關(guān)乎用戶(hù)體驗(yàn)和營(yíng)銷(xiāo)活動(dòng)執(zhí)行效率,如此大量的數(shù)據(jù),在各業(yè)務(wù)系統(tǒng)之間高效穩(wěn)定傳輸,對(duì)系統(tǒng)架構(gòu)提出了很大的挑戰(zhàn)。
當(dāng)當(dāng)網(wǎng)的商品數(shù)據(jù)有多個(gè)來(lái)源,自營(yíng)實(shí)物商品來(lái)源于ERP系統(tǒng),電子書(shū)來(lái)源于數(shù)字業(yè)務(wù)系統(tǒng),商家商品來(lái)源于開(kāi)放平臺(tái),最終這些商品的數(shù)據(jù)都由主業(yè)務(wù)系統(tǒng)中的PIM、庫(kù)存系統(tǒng)、價(jià)格系統(tǒng)集中統(tǒng)一管理,再發(fā)布到搜索系統(tǒng)、推薦系統(tǒng)、前端頁(yè)面展示等系統(tǒng)。為了對(duì)商品信息中的關(guān)鍵數(shù)據(jù)同步時(shí)效進(jìn)行監(jiān)控,當(dāng)當(dāng)網(wǎng)建立了啄木鳥(niǎo)監(jiān)控系統(tǒng),覆蓋了近20個(gè)信息流路徑數(shù)百個(gè)節(jié)點(diǎn),對(duì)超出同步時(shí)限的環(huán)節(jié)自動(dòng)報(bào)警,以便及時(shí)處理,避免發(fā)生嚴(yán)重的延遲。
商品的關(guān)鍵數(shù)據(jù)包括商品基本信息、庫(kù)存和價(jià)格,庫(kù)存和價(jià)格都依賴(lài)于商品基本信息,對(duì)于不同類(lèi)型的數(shù)據(jù),根據(jù)應(yīng)用場(chǎng)景區(qū)別對(duì)待。平臺(tái)化之后,每個(gè)商品都?xì)w屬于一個(gè)商家,以商家ID為維度進(jìn)行散列,將商品基本信息保存在數(shù)據(jù)庫(kù)中,支持水平擴(kuò)展,可以滿(mǎn)足商品數(shù)據(jù)不斷增長(zhǎng)的需要。對(duì)于歷史版本的商品信息,則遷移至歷史版本庫(kù),作為訂單交易快照供用戶(hù)查詢(xún)。庫(kù)存數(shù)據(jù)在前端展示只關(guān)注是否有貨,并不需要將每一次庫(kù)存變化同步,在庫(kù)存變?yōu)?或從0變?yōu)檎麛?shù)時(shí)觸發(fā)狀態(tài)同步,交易下單時(shí)實(shí)時(shí)查詢(xún)當(dāng)前庫(kù)存即可,此種變數(shù)量為狀態(tài)的方式極大地減少了同步數(shù)據(jù)量,提高了數(shù)據(jù)一致性。
價(jià)格屬于高度敏感的數(shù)據(jù),對(duì)于手機(jī)專(zhuān)享價(jià)等類(lèi)型,業(yè)務(wù)運(yùn)營(yíng)有設(shè)置生效時(shí)間、失效時(shí)間的要求,為保證前端按照時(shí)間動(dòng)態(tài)展示,我們將生效時(shí)間段數(shù)據(jù)也發(fā)布到前端系統(tǒng),由使用方判斷當(dāng)前有效價(jià)格。圖2中給出了主要信息流。
即便已經(jīng)對(duì)不同類(lèi)型的商品信息數(shù)據(jù)流進(jìn)行了差異化處理,仍然不能排除短時(shí)間內(nèi)會(huì)發(fā)生大量數(shù)據(jù)造成系統(tǒng)同步阻塞,影響正常業(yè)務(wù)運(yùn)營(yíng)操作的及時(shí)發(fā)布。極端情況下,超出系統(tǒng)處理能力還可能導(dǎo)致系統(tǒng)崩潰。為解決此類(lèi)問(wèn)題,我們采用批量、異步、分流、限流等手段進(jìn)行處理。
批量、批次操作
限制API調(diào)用頻次的同時(shí),我們提供批量API供商家對(duì)商品信息進(jìn)行更新,批量更新方式減少了各環(huán)節(jié)交互次數(shù),提高了系統(tǒng)吞吐量,更好地貼合營(yíng)銷(xiāo)活動(dòng)中批量處理的需求。在系統(tǒng)內(nèi)部,批量方式能夠有效降低系統(tǒng)資源開(kāi)銷(xiāo),并能對(duì)頻繁更新的商品數(shù)據(jù)進(jìn)行合并處理,提高處理速度,使數(shù)據(jù)更新及時(shí)準(zhǔn)確。
增加異步處理,減少同步處理
信息流同步經(jīng)過(guò)多個(gè)系統(tǒng),每個(gè)系統(tǒng)處理邏輯和吞吐能力不同,采用同步機(jī)制可能導(dǎo)致上游系統(tǒng)將下游系統(tǒng)拖垮,因此采用異步機(jī)制最為穩(wěn)妥。異步方式有兩點(diǎn)好處:一方面起到緩沖的作用,下游系統(tǒng)依據(jù)自身能力控制處理數(shù)據(jù)量,避免遭受超負(fù)荷的沖擊,保證系統(tǒng)穩(wěn)定運(yùn)行;另一方面實(shí)現(xiàn)系統(tǒng)隔離解耦,一旦下游系統(tǒng)出現(xiàn)異常,上游系統(tǒng)仍然能正常處理數(shù)據(jù),不至于引發(fā)連鎖反應(yīng)。
分流
不同的信息對(duì)處理時(shí)效的要求也不同,庫(kù)存、價(jià)格、商品上下架狀態(tài)同步及時(shí)性要求很高,而商品基本信息,如名稱(chēng)、副標(biāo)題、詳情則相對(duì)較低。拆分不同的同步路徑,對(duì)及時(shí)性要求高的數(shù)據(jù)配置更多的系統(tǒng)資源,既保障了敏感數(shù)據(jù)的及時(shí)性,又避免了數(shù)據(jù)積壓相互干擾。同理,針對(duì)三種不同的數(shù)據(jù)來(lái)源渠道(ERP、數(shù)字業(yè)務(wù)系統(tǒng)、開(kāi)放平臺(tái)),也可通過(guò)分流方式保證自營(yíng)實(shí)物、電子書(shū)和商家商品信息的及時(shí)同步。
限流
多數(shù)的商品數(shù)據(jù)來(lái)源于商家,商家會(huì)通過(guò)一些第三方系統(tǒng)與當(dāng)當(dāng)網(wǎng)開(kāi)放平臺(tái)對(duì)接,調(diào)用API進(jìn)行數(shù)據(jù)同步。一些不合理的同步機(jī)制設(shè)置會(huì)頻繁發(fā)起大量的數(shù)據(jù)同步請(qǐng)求,而多數(shù)請(qǐng)求屬于無(wú)效數(shù)據(jù),這類(lèi)數(shù)據(jù)難以識(shí)別,會(huì)浪費(fèi)大量的系統(tǒng)資源,干擾有效數(shù)據(jù)的處理。我們?cè)陂_(kāi)放平臺(tái)對(duì)每個(gè)商家調(diào)用API的頻次進(jìn)行限制,根據(jù)商家商品數(shù)量合理分配,有效地抑制了無(wú)效數(shù)據(jù)的泛濫。
隨著多年雙11和集中促銷(xiāo)模式的考驗(yàn),電商系統(tǒng)的峰值設(shè)計(jì)理念和實(shí)踐已經(jīng)慢慢趨于成熟,但仍然是所有電商類(lèi)公司技術(shù)團(tuán)隊(duì)的最重要任務(wù)之一。
當(dāng)當(dāng)網(wǎng)技術(shù)團(tuán)隊(duì)經(jīng)過(guò)多年的沉淀,積累了大量處理電商業(yè)務(wù)峰值的經(jīng)驗(yàn)。通過(guò)深入分析應(yīng)用場(chǎng)景,對(duì)系統(tǒng)進(jìn)行分級(jí),SOA化完成系統(tǒng)解耦,并采用多種技術(shù)手段實(shí)現(xiàn)海量數(shù)據(jù)的高效處理發(fā)布,不斷提升系統(tǒng)吞吐能力,確保為用戶(hù)提供穩(wěn)定友好的購(gòu)物服務(wù)體驗(yàn),充分體現(xiàn)技術(shù)力量在產(chǎn)業(yè)中的重要作用。
促銷(xiāo)系統(tǒng)重構(gòu)
如今大規(guī)模促銷(xiāo)已經(jīng)成為大大小小的電商平臺(tái)及入駐商家運(yùn)營(yíng)的常態(tài)。隨著業(yè)務(wù)的復(fù)雜化、運(yùn)營(yíng)的精細(xì)化,以及品類(lèi)、平臺(tái)、渠道的不斷豐富,各種新的促銷(xiāo)形式也層出不窮,貫穿從商品展示、搜索、購(gòu)買(mǎi)、支付等整個(gè)流程,電商對(duì)于精細(xì)化、精準(zhǔn)化促銷(xiāo)運(yùn)營(yíng)的需求也越來(lái)越強(qiáng)烈。
一次促銷(xiāo)活動(dòng)幾十萬(wàn)商品,一天之內(nèi)幾十個(gè)、上百個(gè)促銷(xiāo)活動(dòng)已是家常便飯,至于入駐商家的常態(tài)促銷(xiāo)更是不勝枚舉。雙十一期間,電商平臺(tái)和商家更是會(huì)使出渾身解數(shù),火力全開(kāi),無(wú)品不促銷(xiāo)。
促銷(xiāo)規(guī)則支持分時(shí)段設(shè)置,多個(gè)活動(dòng)能夠疊加,促銷(xiāo)系統(tǒng)中的數(shù)據(jù)量甚至?xí)^(guò)商品信息系統(tǒng),而且促銷(xiāo)內(nèi)容會(huì)根據(jù)執(zhí)行效果快速調(diào)整,這些都對(duì)促銷(xiāo)系統(tǒng)提出了更高的要求,促銷(xiāo)系統(tǒng)越強(qiáng)大,促銷(xiāo)活動(dòng)才能玩得越瘋狂。
我們?cè)谥貥?gòu)前面臨的狀況,是促銷(xiāo)模型比較陳舊、擴(kuò)展性差,促銷(xiāo)系統(tǒng)成熟度低、與其他系統(tǒng)耦合嚴(yán)重,新增一個(gè)促銷(xiāo)類(lèi)型可能牽動(dòng)從單品展示、搜索、推薦、購(gòu)物車(chē)、交易、訂單、退換貨、庫(kù)存、價(jià)格、促銷(xiāo)自身等一系列產(chǎn)品線(xiàn)的變更。因此,促銷(xiāo)系統(tǒng)的重構(gòu)勢(shì)在必行,數(shù)據(jù)模型與運(yùn)營(yíng)的貼合度決定的擴(kuò)展性、靈活性,系統(tǒng)解耦和更強(qiáng)大的數(shù)據(jù)處理能力,是核心改進(jìn)點(diǎn)。
最基本的促銷(xiāo)模型很簡(jiǎn)單,如下圖:
在當(dāng)當(dāng),有一些“類(lèi)促銷(xiāo)”業(yè)務(wù),從廣義上可以歸入促銷(xiāo)范疇,但業(yè)務(wù)與數(shù)據(jù)均不屬于促銷(xiāo)系統(tǒng),在設(shè)計(jì)中,我們考慮將這類(lèi)業(yè)務(wù)逐漸回收;另外,促銷(xiāo)系統(tǒng)能不能承擔(dān)一些營(yíng)銷(xiāo)的功能?帶著這兩點(diǎn)考慮,在促銷(xiāo)基礎(chǔ)上進(jìn)一步抽象出活動(dòng)模型。
什么是活動(dòng)?我們認(rèn)為任何一個(gè)有時(shí)間范圍的事件/動(dòng)作均可稱(chēng)為活動(dòng),活動(dòng)則抽象為三要素組成:基礎(chǔ)信息、維度(條件)、工具(動(dòng)作)
例如,在11月1日10:00-12:00在第一會(huì)議室開(kāi)雙十一準(zhǔn)備會(huì),討論雙十一各系統(tǒng)需要準(zhǔn)備的事項(xiàng),需要各系統(tǒng)負(fù)責(zé)人參加;那么這個(gè)活動(dòng)的基礎(chǔ)信息包括時(shí)間(11月1日10:00-12:00)、主題(雙十一準(zhǔn)備會(huì)),維度包括地點(diǎn)(第一會(huì)議室)、與會(huì)人員(各系統(tǒng)負(fù)責(zé)人),工具(動(dòng)作)包括議題以及討論本身。
那么推而廣之,理論上,只要有相應(yīng)的工具對(duì)接,可以用這個(gè)極簡(jiǎn)的活動(dòng)模型,去管理任何一類(lèi)活動(dòng),這樣模型就變?yōu)榱藘蓪樱?br />
實(shí)際業(yè)務(wù)中我們遇到過(guò)的一些關(guān)于促銷(xiāo)計(jì)算單元的頭疼問(wèn)題。買(mǎi)了一堆商品,到底哪幾個(gè)應(yīng)該作為一組計(jì)算條件和優(yōu)惠,在促銷(xiāo)疊加的場(chǎng)景這一點(diǎn)顯得更為復(fù)雜。所以我們引入作用域來(lái)定義這個(gè)計(jì)算單元的范圍。例如常規(guī)的限時(shí)搶促銷(xiāo),每個(gè)SKU有自己的價(jià)格,那么SKU就是這個(gè)促銷(xiāo)的計(jì)算單元,也就是促銷(xiāo)的作用域;例如第二件5折,可能會(huì)按SPU來(lái)做,你買(mǎi)一個(gè)紅的一個(gè)藍(lán)的,還是能享受促銷(xiāo),那么SPU成為了這個(gè)促銷(xiāo)的計(jì)算單元;諸如此類(lèi),現(xiàn)有及未來(lái)可擴(kuò)展的還有店鋪、品類(lèi)、品牌等等。簡(jiǎn)言之,這個(gè)作用域成為促銷(xiāo)計(jì)算引擎進(jìn)行計(jì)算單元分組的依據(jù)。于是模型又變成了這樣:
舉個(gè)例子,我們要在11月11日11:00-12:00針對(duì)IT技術(shù)類(lèi)圖書(shū)進(jìn)行滿(mǎn)200元減100元促銷(xiāo),購(gòu)買(mǎi)過(guò)此類(lèi)圖書(shū)的客戶(hù)每本書(shū)每人限購(gòu)一冊(cè)。那么這個(gè)活動(dòng)的基礎(chǔ)信息包括時(shí)間(11月11日11:00-12:00)、主題(程序猿光棍節(jié)福利);維度包括商品品類(lèi)(IT技術(shù))、用戶(hù)范圍(購(gòu)買(mǎi)過(guò)此類(lèi)圖書(shū)的客戶(hù));工具是滿(mǎn)額減促銷(xiāo)、以金額滿(mǎn)200元為條件、減100元為優(yōu)惠,此外還有限購(gòu)策略為限購(gòu)1本,作用域?yàn)閰⑴c活動(dòng)的所有商品;
可能這里會(huì)引發(fā)困擾,基礎(chǔ)信息的時(shí)間為何不能算做時(shí)間維度?維度也定義了一些限制條件,那和促銷(xiāo)工具模型里的條件有什么區(qū)別?時(shí)間之所以不歸入維度,是基于前面對(duì)活動(dòng)的定義,時(shí)間范圍是必須的,而維度是可選的;促銷(xiāo)模型中的條件只對(duì)于促銷(xiāo)工具有效和有意義,而維度則有更廣泛的普適性,例如平臺(tái)、渠道、地區(qū)、用戶(hù)、商品等,與工具是什么并無(wú)關(guān)系。
基礎(chǔ)模型定型之后,我們開(kāi)始著手解耦方面的設(shè)計(jì):
首先是系統(tǒng)交互解耦,將直讀DB和存儲(chǔ)冗余促銷(xiāo)數(shù)據(jù)的系統(tǒng)修改為調(diào)用服務(wù)及監(jiān)聽(tīng)MQ;然后是邏輯回收,包括將促銷(xiāo)校驗(yàn)與促銷(xiāo)計(jì)算提取為交易服務(wù),將原先由購(gòu)物車(chē)、交易系統(tǒng)自行處理的促銷(xiāo)邏輯回收;從業(yè)務(wù)上,將促銷(xiāo)工具的屬性進(jìn)行提取,諸如類(lèi)型枚舉、促銷(xiāo)標(biāo)簽、限購(gòu)策略、庫(kù)存策略等,以期外圍系統(tǒng)盡量少的關(guān)注促銷(xiāo)類(lèi)型,通過(guò)促銷(xiāo)ID拿到所需信息直接使用;未來(lái)則關(guān)注于業(yè)務(wù)層面的梳理與整合,逐步回收適用于活動(dòng)模型的其他“類(lèi)促銷(xiāo)”業(yè)務(wù)。
系統(tǒng)解耦后,促銷(xiāo)系統(tǒng)需要提供各系統(tǒng)所需要的服務(wù),必須具備更強(qiáng)大的數(shù)據(jù)處理能力和更好的性能表現(xiàn)。應(yīng)用架構(gòu)實(shí)現(xiàn)上,從前端頁(yè)面到后端邏輯,盡量避免有邏輯與促銷(xiāo)類(lèi)型直接綁定,全部以插件化方式與促銷(xiāo)模型對(duì)接,完全根據(jù)促銷(xiāo)類(lèi)型的配置進(jìn)行組裝。針對(duì)不同維度、條件、優(yōu)惠、促銷(xiāo)屬性,定制頁(yè)面模板及業(yè)務(wù)邏輯,使得新增一種促銷(xiāo)類(lèi)型(在已有維度、條件、優(yōu)惠下)僅需配置即可完成。
促銷(xiāo)系統(tǒng)的查詢(xún)服務(wù)需要同時(shí)為多個(gè)系統(tǒng)提供數(shù)據(jù),對(duì)TPS要求很高,同時(shí)促銷(xiāo)的時(shí)效性又要求很高的實(shí)時(shí)性。我們采用的方式是在數(shù)據(jù)庫(kù)前加Redis緩存,提高響應(yīng)速度,同時(shí)監(jiān)聽(tīng)MQ,根據(jù)事件清理相應(yīng)的緩存數(shù)據(jù)。
這種設(shè)計(jì)方案也有一些可能的坑,例如Redis緩存雖然減輕了DB壓力,但對(duì)于計(jì)算密集型應(yīng)用并未減輕應(yīng)用服務(wù)器壓力,IO沒(méi)有節(jié)省還增加了序列化的開(kāi)銷(xiāo);事件驅(qū)動(dòng)清理緩存在讀寫(xiě)分離場(chǎng)景下,有可能比主從同步更快,造成緩存數(shù)據(jù)錯(cuò)誤。這也是具體應(yīng)用中需要注意的地方。
促銷(xiāo)系統(tǒng)重構(gòu)上線(xiàn)后,使多渠道(終端)、多區(qū)域化營(yíng)銷(xiāo)成為簡(jiǎn)單易行的配置操作,顯著提高了當(dāng)當(dāng)運(yùn)營(yíng)能力,當(dāng)當(dāng)雙十一呈現(xiàn)出更多的想象空間。
交易系統(tǒng)重構(gòu)
交易系統(tǒng)是客戶(hù)購(gòu)物流程中最重要的環(huán)節(jié),主要任務(wù)是完成購(gòu)物車(chē)中商品信息獲取、拆單、促銷(xiāo)計(jì)算、配貨計(jì)算、運(yùn)費(fèi)計(jì)算、非現(xiàn)金支付的使用以及生成訂單等操作,聚合各方面業(yè)務(wù)邏輯,計(jì)算非常復(fù)雜,而且響應(yīng)速度影響購(gòu)買(mǎi)轉(zhuǎn)化率,一旦出現(xiàn)故障,直接影響營(yíng)業(yè)收入,可謂電商最為敏感的核心系統(tǒng),決定對(duì)其進(jìn)行重構(gòu)需要極大的魄力。
當(dāng)當(dāng)原有交易系統(tǒng)采用.NET技術(shù)框架,運(yùn)行多年,很好的支撐了購(gòu)買(mǎi)流程,但是弊端逐漸顯露。首先是技術(shù)體系屬于微軟系,每年要花費(fèi)大量成本購(gòu)買(mǎi)服務(wù);其次是隨著業(yè)務(wù)需求的不斷疊加,其結(jié)構(gòu)及可維護(hù)性逐年下降,尤其是眾多小版本結(jié)算的存在,使得功能擴(kuò)展異常艱難。
基于以上因素,交易系統(tǒng)團(tuán)隊(duì)在2014年底啟動(dòng)重構(gòu)項(xiàng)目,2015年10月底新老版本完成切換。此次重構(gòu)耗費(fèi)約1500人天,重構(gòu)代碼17萬(wàn)行,全部切換至Java開(kāi)源技術(shù)架構(gòu),為公司節(jié)約大量成本,并進(jìn)行了架構(gòu)優(yōu)化,整體性能平均提升25%。
交易系統(tǒng)業(yè)務(wù)主流程圖如下:
交易系統(tǒng)重構(gòu)引入了許多業(yè)界成熟的技術(shù)實(shí)現(xiàn)方案,主要有以下幾點(diǎn):
1. 集中化配置
集中化配置方式,一點(diǎn)配置,所有實(shí)例可見(jiàn),更易于管理,而且配置修改后,通過(guò)熱加載方式,立刻生效,快速便捷。而原有交易系統(tǒng)修改配置后,必須重啟系統(tǒng)才能生效。
2. 頁(yè)面緩存技術(shù)
用戶(hù)請(qǐng)求一次交易結(jié)算頁(yè)面,會(huì)調(diào)用各種后端服務(wù),而由于邏輯的復(fù)雜性,每次服務(wù)調(diào)用都會(huì)調(diào)用訂單計(jì)算大流程,導(dǎo)致頁(yè)面刷新緩慢。新交易系統(tǒng)將大流程計(jì)算結(jié)果進(jìn)行緩存,在一次頁(yè)面請(qǐng)求范圍內(nèi),后續(xù)調(diào)用直接用緩存結(jié)果,極大提高了頁(yè)面的刷新速度。
3. 小版本合并
由于歷史原因,交易系統(tǒng)存在很多版本的結(jié)算邏輯。最常用的是統(tǒng)一結(jié)算,還有一些特殊類(lèi)型的結(jié)算,如秒殺、一鍵下單、補(bǔ)發(fā)貨等等,邏輯與統(tǒng)一結(jié)算稍有不同,統(tǒng)稱(chēng)為小版本結(jié)算。因小版本結(jié)算與統(tǒng)一結(jié)算大部分邏輯相同,因此新交易系統(tǒng)將二者合到了一起,共享基礎(chǔ)邏輯,而不同的邏輯則單獨(dú)處理,極大提高了可維護(hù)性。
4. 灰度發(fā)布、無(wú)縫切換
借助了Nginx在運(yùn)行狀態(tài)下可以reload配置,而基本不影響對(duì)外提供服務(wù)的能力。每個(gè)Nginx負(fù)載兩臺(tái)應(yīng)用服務(wù)器,灰度發(fā)布時(shí),將Nginx配置更改為只負(fù)載一臺(tái)應(yīng)用服務(wù)器,即可對(duì)另一臺(tái)進(jìn)行部署。用戶(hù)請(qǐng)求不會(huì)導(dǎo)向正在部署中的服務(wù)器,從而不影響用戶(hù)下單。
5. 并行比對(duì)
交易系統(tǒng)重構(gòu)后,盡管進(jìn)行了大量的測(cè)試,仍不能放心部署上線(xiàn)。因?yàn)榻灰紫到y(tǒng)的計(jì)算都和金錢(qián)有關(guān),必須慎之又慎,我們提出了線(xiàn)上并行比對(duì)方案,根據(jù)老交易系統(tǒng)比對(duì)新交易,保證其邏輯正確。原理如下:
1) 用戶(hù)請(qǐng)求到達(dá)老交易系統(tǒng)
2) 根據(jù)條件將部分請(qǐng)求數(shù)據(jù)復(fù)制,發(fā)送至調(diào)用mock服務(wù)的新交易系統(tǒng)
3) 新老交易同時(shí)計(jì)算,結(jié)果存入各自的數(shù)據(jù)庫(kù),但只有老交易結(jié)果對(duì)用戶(hù)公開(kāi)
4) 對(duì)新老計(jì)算結(jié)果進(jìn)行比對(duì)
這樣,既實(shí)現(xiàn)了比對(duì)目的,又不會(huì)影響線(xiàn)上環(huán)境。
6. 分流
比對(duì)之后,新交易系統(tǒng)也不能立即全面上線(xiàn),那樣可能有巨大風(fēng)險(xiǎn)。我們開(kāi)發(fā)了分流功能,按照用戶(hù)id來(lái)分流,正式分流前,先使用測(cè)試白名單中的用戶(hù)進(jìn)行預(yù)驗(yàn)證。預(yù)驗(yàn)證通過(guò)后,再按比例由低至高逐步切換。
7. Web服務(wù)器按需伸縮
基于前面所講的灰度發(fā)布技術(shù),新交易系統(tǒng)很容易做到按需伸縮。正常情況下,每個(gè)Nginx負(fù)載兩臺(tái)應(yīng)用服務(wù)器。雙十一需要擴(kuò)容時(shí),將待擴(kuò)服務(wù)器ip地址加入Nginx配置,重新reload,該Nginx就可負(fù)載更多臺(tái)應(yīng)用服務(wù)器了。
交易系統(tǒng)上線(xiàn)后為備戰(zhàn)雙十一,確保萬(wàn)無(wú)一失,利用老交易系統(tǒng)還未下線(xiàn)的條件進(jìn)行了線(xiàn)上壓測(cè)。為達(dá)到最準(zhǔn)確的測(cè)試效果,且不影響正常系統(tǒng)運(yùn)行,進(jìn)行了以下的準(zhǔn)備:
1. 測(cè)試環(huán)境、數(shù)據(jù)與生產(chǎn)環(huán)境一致
在準(zhǔn)備測(cè)試環(huán)境方面,為了保證測(cè)試結(jié)果更接近真實(shí)結(jié)果,本次測(cè)試使用線(xiàn)上環(huán)境,通過(guò)大量測(cè)試賬號(hào)對(duì)線(xiàn)上的真實(shí)促銷(xiāo)商品進(jìn)行測(cè)試,這樣也對(duì)新交易系統(tǒng)所依賴(lài)的各系統(tǒng)服務(wù)做了檢驗(yàn)。
2. 線(xiàn)上業(yè)務(wù)運(yùn)行保障
測(cè)試階段線(xiàn)上的請(qǐng)求切到老交易系統(tǒng),壓測(cè)請(qǐng)求發(fā)送到新交易系統(tǒng),使測(cè)試和生產(chǎn)業(yè)務(wù)進(jìn)行分離,保證了各自服務(wù)器資源的獨(dú)立性。在應(yīng)用服務(wù)器層面使測(cè)試過(guò)程不會(huì)影響到線(xiàn)上正常交易。
3. 攔截訂單回收庫(kù)存
由于使用線(xiàn)上環(huán)境測(cè)試,需要對(duì)測(cè)試訂單進(jìn)行攔截,避免進(jìn)入生產(chǎn)流程,并回收占用的庫(kù)存,使商品不會(huì)耗盡庫(kù)存,采用的方法是在自動(dòng)審單系統(tǒng)中將測(cè)試賬戶(hù)加入黑名單,測(cè)試訂單提交后會(huì)被攔截,然后取消訂單釋放庫(kù)存。為防止測(cè)試過(guò)程占用了商品的全部庫(kù)存而影響線(xiàn)上銷(xiāo)售,測(cè)試商品池基數(shù)很大,并且過(guò)濾掉了庫(kù)存數(shù)量較少的商品,在執(zhí)行測(cè)試過(guò)程中控制每個(gè)商品的使用次數(shù),保證可銷(xiāo)售庫(kù)存占用在安全范圍內(nèi)。
4. 惡意用戶(hù)策略控制
因?yàn)樵诮灰紫聠芜^(guò)程中包含惡意用戶(hù)判定的策略,會(huì)對(duì)用戶(hù)進(jìn)行隔離,禁止連續(xù)大量下單,線(xiàn)上壓測(cè)時(shí)根據(jù)實(shí)際情況短時(shí)間內(nèi)調(diào)整了安全級(jí)別,保證訂單成功率。
經(jīng)過(guò)多輪線(xiàn)上壓測(cè),新交易系統(tǒng)的高可用性得到驗(yàn)證,得到了實(shí)際性能指標(biāo),并根據(jù)雙十一流量估算進(jìn)行了擴(kuò)容部署,將以嶄新的面貌為廣大客戶(hù)提供穩(wěn)定可靠便捷的網(wǎng)購(gòu)服務(wù)。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。