做設(shè)計(jì)網(wǎng)站模塊的網(wǎng)站杭州網(wǎng)絡(luò)優(yōu)化公司排名
目錄
- 一.背景
- 1.1 業(yè)務(wù)背景
- 1.2 技術(shù)負(fù)債
- 二.技術(shù)目標(biāo)
- 三.方案設(shè)計(jì)
- 3.1 解決移動(dòng)端頻繁發(fā)版
- 3.1.1 場(chǎng)景分析
- 3.1.2 技術(shù)方案
- 3.2 減少后端壞味道代碼&無(wú)法靈活擴(kuò)展問(wèn)題
- 3.2.1 通過(guò)抽象接口完成各自單獨(dú)樓層渲染邏輯
- 3.2.2 通過(guò)配置能力做到部分字段可配
- 四.升級(jí)上線(普適于高并發(fā)大流量的業(yè)務(wù)場(chǎng)景的功能上線更新)
專欄系列
-SaaS 電商設(shè)計(jì) (一) 如何設(shè)計(jì)一套適應(yīng)多規(guī)格的商品服務(wù)
-SaaS 電商設(shè)計(jì) (二) 私有化部署-緩存中間件適配
-SaaS 電商設(shè)計(jì) (三) 電商黃金流程(商詳,購(gòu)物車,提單)梳理,持續(xù)更新(建議收藏)
-SaaS 電商設(shè)計(jì) (四) 談一談電商系統(tǒng)高并發(fā)多耦合上下游的系統(tǒng)壓測(cè)怎么做
-SaaS 電商設(shè)計(jì) (五) 私有化部署-實(shí)現(xiàn) binlog 中間件適配(附源碼)
-SaaS 電商設(shè)計(jì) (六) 實(shí)現(xiàn) id 生成器本地化生產(chǎn) (附源碼)
-SaaS 電商設(shè)計(jì) (七) 利用 Spring 擴(kuò)展點(diǎn) ImportBeanDefinitionRegistrar 實(shí)現(xiàn) toB 系統(tǒng)對(duì)接(附源碼)
-SaaS 電商設(shè)計(jì) (八) 直接就能用的一套電商商品池完整設(shè)計(jì)方案(建議收藏)
一.背景


購(gòu)物車是電商交易流程中的關(guān)鍵模塊,承上啟下,作為導(dǎo)購(gòu)環(huán)節(jié)的最后一環(huán),為用戶在多個(gè)場(chǎng)景下進(jìn)行購(gòu)物決策提供便利。除了支持用戶對(duì)自己的購(gòu)物車進(jìn)行常規(guī)的增刪改查操作外,購(gòu)物車還提供了豐富的功能,如湊單、換購(gòu)、手動(dòng)換促銷、自動(dòng)切換最優(yōu)促銷、自動(dòng)領(lǐng)券結(jié)算、設(shè)置常購(gòu)商品、篩選搜索等,以提高用戶的操作效率和決策能力。此外,購(gòu)物車還具備一系列營(yíng)銷能力,包括砸京蛋、跨店滿減、每日一促、無(wú)貨推薦和營(yíng)銷氛圍增強(qiáng)等,以增加用戶的購(gòu)買欲望和促進(jìn)銷售額的增長(zhǎng)。
????如上圖是某電商購(gòu)物車的底部一個(gè)彈層功能,提供的是當(dāng)前勾選商品后具體結(jié)算金額的明細(xì).如:優(yōu)惠券優(yōu)惠明細(xì),plus95折明細(xì).plus會(huì)員購(gòu)物返利等.是一個(gè)用戶結(jié)算的工具.
1.1 業(yè)務(wù)背景
????話不多說(shuō),書歸正傳.從開頭圖例來(lái)看,在具體研發(fā)過(guò)程中其實(shí)是存在很多種底部彈層的場(chǎng)景.目前是業(yè)務(wù)場(chǎng)景玩法越來(lái)越多的背景下,迭代速度也日漸頻繁.對(duì)于后端技術(shù)同學(xué)不得不在這些業(yè)務(wù)插入諸多的樓層代碼去補(bǔ)齊業(yè)務(wù)場(chǎng)景邏輯.而且通過(guò)增加字段的方式每次的變更都需要聯(lián)合前后端同時(shí)的迭代開發(fā),考慮到 app 端開發(fā)發(fā)版節(jié)奏相對(duì)低頻且成本較大.存在業(yè)務(wù)訴求和開發(fā)迭代周期之間的 gap .能否存在僅后端發(fā)布解決迭代更新的可能?而且盡可能少的改動(dòng)去完成迭代開發(fā)?
底部彈層的業(yè)務(wù)場(chǎng)景迭代頻率較高
1.2 技術(shù)負(fù)債
????在這些頻繁的業(yè)務(wù)場(chǎng)景迭代過(guò)程中,研發(fā)側(cè)不得不更緊湊的迭代周期去完成指定的迭代任務(wù).導(dǎo)致不得不在歷史諸多代碼中龍飛鳳舞,后來(lái)者更是不敢錯(cuò)過(guò)一行,小心翼翼找尋代碼,更新改動(dòng).長(zhǎng)此以往愈演愈烈,這批代碼就成為不可被替代開發(fā)者之代碼.不用說(shuō)開閉原則,優(yōu)雅維護(hù)起來(lái)也變得遙不可及.如下是其中一個(gè)小類,關(guān)注與左下角. 5k+ 行.

????每每服務(wù)端更新相應(yīng)邏輯, app 移動(dòng)端不得不跟隨改動(dòng),發(fā)布集成,更新版本.周期較長(zhǎng).
長(zhǎng)期的版本更新,代碼維護(hù)性較差
不可擴(kuò)展的更新,導(dǎo)致移動(dòng)端跟隨發(fā)布
二.技術(shù)目標(biāo)
- 在高頻的業(yè)務(wù)迭代節(jié)奏中盡可能去低改動(dòng)去完成業(yè)務(wù)目標(biāo)
- 技術(shù)實(shí)現(xiàn)盡可能可擴(kuò)展,利于維護(hù)(滿足開閉原則)
- 鑒于移動(dòng)端發(fā)版周期長(zhǎng).盡可能移動(dòng)端不改動(dòng),不迭代.即減少聯(lián)調(diào)成本也利于快速排查問(wèn)題.
三.方案設(shè)計(jì)
3.1 解決移動(dòng)端頻繁發(fā)版
3.1.1 場(chǎng)景分析

鑒于以上的一個(gè)公共特征,如上分析我們看起來(lái)可以抽象一個(gè)類 floor 去完成每一行的渲染,每一行的副標(biāo)題也是同樣可以繼續(xù)復(fù)用.以此來(lái)解決每次新增場(chǎng)景,同步新增字段來(lái)處理的邏輯.這樣的話除了共減場(chǎng)景的渲染其他看起來(lái)是一致的.所有的渲染移動(dòng)端可以通過(guò)遍歷 floor 的數(shù)組去完成整個(gè)彈層的渲染.這樣一來(lái)的話,移動(dòng)端的工作就變得非常簡(jiǎn)單,僅僅開發(fā)一次看起來(lái)就解決了問(wèn)題.這樣就解決了我們的第三個(gè)技術(shù)目標(biāo).完成移動(dòng)端免除跟隨發(fā)版的困擾.具體如下:
3.1.2 技術(shù)方案

其中 sort 字段是為了支持產(chǎn)品的一些排序訴求.這里就比較簡(jiǎn)單了.通過(guò)實(shí)現(xiàn) Comparable 接口即可.具體渲染后是這樣
{"floorDetails": [{"floorItemCode": "spze","floorItemName": "商品總額","floorItemPrice": "¥20.90","styleExt": ["bold"]},{"floorItemCode": "lj","floorItemName": "立減","floorItemPrice": "-¥5.00"},{"floorItemCode": "coupon","floorItemName": "優(yōu)惠券","floorItemPrice": "-¥6.00","floorItemSubName": "已領(lǐng)券 -¥6.00"},{"floorItemCode": "plus95","floorItemName": "PLUS專享95折","floorItemPrice": "-¥1.04","floorItemSubName": "本月剩余優(yōu)惠額度 ¥1,000.00"}]
}
如上的數(shù)據(jù)結(jié)構(gòu) app 端就可以通過(guò)數(shù)組遍歷的形式來(lái)獲取指定樓層渲染的邏輯.在后端動(dòng)態(tài)增加item時(shí),也盡可能的做到少改動(dòng),甚至不改動(dòng)即可做到支持.解決我們第一個(gè)技術(shù)目標(biāo):在高頻的業(yè)務(wù)迭代節(jié)奏中盡可能去低改動(dòng)去完成業(yè)務(wù)目標(biāo)
3.2 減少后端壞味道代碼&無(wú)法靈活擴(kuò)展問(wèn)題
3.2.1 通過(guò)抽象接口完成各自單獨(dú)樓層渲染邏輯

如上我們抽象一個(gè) FloorBuilder 類接口,通過(guò)具體的 FloorItemCode 來(lái)進(jìn)行尋找指定的類進(jìn)行渲染.這樣一來(lái)每個(gè) code 對(duì)應(yīng)的渲染和獲取邏輯都能夠在各自的類中,避免都在同一個(gè)類中書寫大量邏輯.對(duì)于修改和新增來(lái)說(shuō),后來(lái)的同學(xué)去追尋歷史邏輯的成本相對(duì)較低.
3.2.2 通過(guò)配置能力做到部分字段可配

如上通過(guò)結(jié)合配置中間件的能力,做到部分字段可配置,下發(fā)配置后可以通過(guò)遍歷所有的配置.通過(guò)配置code來(lái)獲取指定的策略類來(lái)完成指定樓層渲染.解決我們第二個(gè)技術(shù)目標(biāo):技術(shù)實(shí)現(xiàn)盡可能可擴(kuò)展,利于維護(hù)(滿足開閉原則)
四.升級(jí)上線(普適于高并發(fā)大流量的業(yè)務(wù)場(chǎng)景的功能上線更新)
如上是大概的技術(shù)方案,整體的迭代過(guò)程中僅僅是完成了功能的改造.能感受到整體的改動(dòng)還是非常大的.尤其是作為技術(shù)側(cè)的一個(gè)優(yōu)化.再加上本身是一個(gè)黃金流程中非常重要的一環(huán).本身來(lái)說(shuō)穩(wěn)定性是第一位的.所以這里關(guān)于升級(jí)發(fā)布的流程也做一個(gè)大致的介紹.要知道,如此高并發(fā)的場(chǎng)景出了一個(gè)問(wèn)題,不用問(wèn)就是要被拖入**“廣進(jìn)”**的,小伙子你也不想的吧.

上線第一要義:穩(wěn)定穩(wěn)定還是穩(wěn)定.穩(wěn)定壓倒一切.到底怎么做.
- 1.第一要支持灰度
- 2.最好要有支持版本控制
- 3.最次最低要支持開關(guān)降級(jí),實(shí)在不行下線相應(yīng)功能完成動(dòng)態(tài)完成問(wèn)題功能下線
總結(jié)起來(lái)就是首先要小流量試跑,出問(wèn)題要有后路.給程序留后路也是給目前經(jīng)濟(jì)不景氣的自己留后路哈.兄弟們.話不多說(shuō),一圖勝千言.上圖.
總體上一個(gè)非常普適的高流量高并發(fā)通用的線上發(fā)布功能流程.略去了一些細(xì)節(jié),大體上的思路還是能看的到.具體介紹下.
- step1:第一個(gè)是開發(fā)功能(含分支管理的流程)
稍微擴(kuò)展下.大廠的場(chǎng)景基本上如此.
稍有不同的是,貓廠是各個(gè)feature branch 合并動(dòng)作是自動(dòng)通過(guò)aone來(lái)控制的,并且合并master的動(dòng)作是整體的上線流程完成之后自動(dòng)通過(guò)aone完成.
狗廠的流程目前各個(gè)feature branch 手動(dòng)合并到本次一個(gè)vxx branch ,最后通過(guò)合并到master來(lái)進(jìn)行線上部署.
ps:貓廠整體流程化還是相對(duì)來(lái)說(shuō)要更加自動(dòng)化一些.
- step2:完成預(yù)發(fā)環(huán)境的驗(yàn)證
這里有兩個(gè)點(diǎn).
– 合并后的 vxx branch 功能合集驗(yàn)證,比如說(shuō)本次的技術(shù)樓層優(yōu)化.
– 本次功能代碼鏈接線上配置,數(shù)據(jù)庫(kù),服務(wù)等預(yù)線上環(huán)境驗(yàn)證.
這里如果還涉及到一些接口的改造,其實(shí)還需要有壓力驗(yàn)證,這里就沒有體現(xiàn)
- step3:上線流程前的一個(gè)review
對(duì)于本次的話,技術(shù)優(yōu)化可能相對(duì)來(lái)說(shuō)比較大一個(gè)改造.通常盡量是做到組內(nèi)的一次上線前的review,確定切量范圍,確定版本控制,確定回滾方案,確定降級(jí)方案
-step4:上線過(guò)程中的流量切換
流量切換前一定要保證流量切掉后,剩余的機(jī)房能夠支持現(xiàn)有日常流量這個(gè)就要大家各自參考各自系統(tǒng)目前的水位情況以及日常qps了.
-
流量切換到001機(jī)房,完成002,003機(jī)房部署以及部署后的單機(jī)驗(yàn)證.np掛載.掛載后的vip驗(yàn)證.
-
流量切換到002機(jī)房,003機(jī)房.摘除001機(jī)房流量.這樣保持盡量長(zhǎng)的時(shí)間(12h),利用線上的用戶流量做一次灰度流量驗(yàn)證.(一般的功能驗(yàn)證),其實(shí)如果是較大的功能且功能較大,可以在整體之前加一個(gè)內(nèi)部pin驗(yàn)證.對(duì)應(yīng)倒數(shù)第二組的圖內(nèi)容.
-
步驟2的過(guò)程中沒有任何問(wèn)題,此時(shí)001機(jī)房已經(jīng)摘量,可以繼續(xù)完成鏡像部署.還是同樣的流程,完成單機(jī)驗(yàn)證,多集群部署,np掛載,vip驗(yàn)證.也就是最后一組圖中的內(nèi)容.
贈(zèng)人玫瑰 手有余香 我是柏修 一名持續(xù)更新的晚熟程序員
期待您的點(diǎn)贊,關(guān)注加收藏,加個(gè)關(guān)注不迷路,感謝
您的鼓勵(lì)是我更新的最大動(dòng)力
↓↓↓↓↓↓