電商剛開始發(fā)展的時候,由于組織人員比較少,追求短平快的開發(fā)方式,所以大家都集中在幾個GIT工程里開發(fā)。大部分核心代碼包括商品、交易、營銷等業(yè)務(wù)邏輯都寫到kuaishou-ad-merchant-component里。隨著人員規(guī)模的膨脹,開發(fā)維護效率都比較低。我做的第一個事就是拆服務(wù),總體思路是不修改業(yè)務(wù)邏輯,把秒殺活動的代碼從component里遷移到單獨的GIT工程。這里主要需要注意的點就是,盡量不要動業(yè)務(wù)邏輯,有些直接調(diào)其他領(lǐng)域的service的地方改成調(diào)rpc,這樣方便兩邊代碼做DIFF?;叶炔呗允切略鲆粋€XX_V2版本的rpc,入?yún)⒑统鰠⒏瓉淼膔pc保持一致,在SDK預(yù)埋灰度開關(guān),進行新老服務(wù)的切換,業(yè)務(wù)方只需要重新打包上線即可。
難度:🌟
不足:業(yè)務(wù)需求比較多,測試資源不足等原因,導(dǎo)致整體開發(fā)周期比較長。拆分的粒度可以更小一點,分批上線,這樣能保證整體交付周期更短。
2、電商二代架構(gòu)電商營銷域系統(tǒng)重構(gòu),包含優(yōu)惠券、優(yōu)惠活動等子系統(tǒng)。重構(gòu)的背景和原因這里不展開說了。面臨的主要挑戰(zhàn)是領(lǐng)域模型和系統(tǒng)架構(gòu)都是推到重來,這里就涉及到異構(gòu)數(shù)據(jù)遷移,數(shù)據(jù)雙寫、校驗、比對,接口遷移等。
整體上線流程如下:
需要注意的點:
1、雙寫過程中,寫新服務(wù)可能會失敗,需要做好補償機制。這里我們補償策略有兩種,第一種是調(diào)用新服務(wù)失敗,會用MQ重試。第二種是監(jiān)聽老DB的binlog,如果發(fā)現(xiàn)老庫有,新庫沒有就會insert。PS:新老數(shù)據(jù)服務(wù)使用同一個ID生成器,所以可以重試。
2、讀接口遷移過程中,由于QA無法覆蓋所有的業(yè)務(wù)場景,所以需要做接口的DIFF。實現(xiàn)思路比較簡單,就是在讀老接口的時候,異步調(diào)下新接口,做新老接口返回的DIFF打點。實際上的確很多隱藏的BUG都是DIFF發(fā)現(xiàn)的。
3、配套工具不能少,比如數(shù)據(jù)訂正,當(dāng)開始上線的時候,代碼難免有問題,需要批量訂正數(shù)據(jù)。
4、對外提供的接口,接口協(xié)議就好不要改,否則很難推動業(yè)務(wù)方去遷移。
難度:🌟 🌟 🌟 🌟 🌟
不足:歷史包袱比較重,整體遷移節(jié)奏不可控,戰(zhàn)線拉的比較長。重構(gòu)每一個迭代的范圍可以再縮小一些,小步快跑,這樣團隊的目標(biāo)感會更明確。(PS:這種大規(guī)模的系統(tǒng)重構(gòu),項目管理難度的確很大)
3、廣告投放系統(tǒng)重構(gòu)背景是三條業(yè)務(wù)線,電商、粉條、信息流都在一個項目里開發(fā),里面耦合的邏輯比較多。并且相互之間影響比較大,總體來說開發(fā)、上線節(jié)奏都比較慢,而且上線容易翻車。目標(biāo)是服務(wù)拆分,實現(xiàn)自治。解決方案是通用邏輯沉淀到中臺,以jar包的形式提供給業(yè)務(wù)方,同時沉淀了ADF框架,包含自研的ORM框架和業(yè)務(wù)流程編排。重構(gòu)完成以后,業(yè)務(wù)方獨立部署上線,不會相互影響。主要難點是廣告業(yè)務(wù)比較復(fù)雜,字段比較多,還有一些意想不到的特殊邏輯。所以這里核心難點在于QA。我們的方案是搭建兩個環(huán)境一個是開發(fā)環(huán)境(打到新服務(wù)),另外一個是基準環(huán)境(老服務(wù)),通過流量回放,做接口返回DIFF、DB數(shù)據(jù)DIFF、以及查詢接口DIFF,保證數(shù)據(jù)的一致性。
難點: 🌟 🌟 🌟
做得好的:為了盡量減少雙開發(fā)的時間,灰度粒度控制的比較細(字段維度),等同于項目迭代拆得比較細,這樣能盡可能做到小步快跑,對業(yè)務(wù)的影響最小。
總結(jié)
1、為什么需要重構(gòu)?
重構(gòu)之前需要充分的論證,重構(gòu)的意義在哪里?有沒有做競品調(diào)研?業(yè)務(wù)未來方向是什么樣的? 重構(gòu)是一項非常費時費力,而且不那么容易在短期就看到收益的事。新系統(tǒng)需要能cover老的功能,同時能滿足未來幾年的擴展。
2、需要推到重來嗎?
從上面例子可以看到,修改底層數(shù)據(jù)模型的case,重構(gòu)難度大。在我們開發(fā)新系統(tǒng)的時候,需要多花點時間在模型設(shè)計和接口協(xié)議上。
3、上下游會配合嗎?
上下游配合一方面需要leader給資源支持,另外一方面需要盡量減少別人的遷移成本,所以盡量保證接口定義不變。老接口需要兼容,新的更合理的接口可以提供的業(yè)務(wù)方選擇,慢慢遷移。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧