最近幾年以清,中臺之風盛行,各行各業(yè)都希望能建設(shè)自己的”大中臺贮竟,小前臺“丽焊,期望能夠通過強大中臺的復用能力快速的賦能業(yè)務,讓新業(yè)務可以快速試錯咕别,降低整體成本技健,但是實踐下來發(fā)現(xiàn)困難重重。剛好最近在參與一個跨域功能點的復用開發(fā)惰拱,借此梳理下軟件架構(gòu)中復用的一種路徑雌贱。
最開始不同業(yè)務為了快速成長,一般都是在各自的系統(tǒng)中開發(fā),例如三個電商業(yè)務A欣孤、B馋没、C會有各自的交易、支付降传、商品等完整的電商系統(tǒng)篷朵。
隨著公司的發(fā)展,發(fā)現(xiàn)各個業(yè)務之間有很多公共的特性婆排,如果還是在各自系統(tǒng)中單獨實現(xiàn)声旺,不利于能力的復用與沉淀,另外還有一些其他因素的考慮(例如打造公司生態(tài)系統(tǒng)泽论,打通不同業(yè)務線的數(shù)據(jù)壁壘)艾少,于是慢慢將公共的功能抽取出來形成了底層平臺,例如交易平臺翼悴,支付平臺缚够。
平臺型解決了復用了問題,但是卻面臨了擴展(定制)的問題鹦赎,每個業(yè)務之間都存在不同的玩法谍椅,業(yè)務邏輯存在較大的差異,例如業(yè)務A在計算訂單金額時需要增加費用PA1古话,于是A在生成訂單的接口中增加了一個額外費用的參數(shù)PA1雏吭。
隨著業(yè)務的發(fā)展,業(yè)務A中對于金額的計算發(fā)生了變化陪踩,增加的金額變成了2*PA1杖们,但是當業(yè)務方開發(fā)修改時,不敢直接在之前的定制邏輯中修改肩狂,因為不知道參數(shù)PA1到底被多少業(yè)務方使用了(很可能業(yè)務方B也使用了這個參數(shù))摘完,因此這個時候往往再增加一個參數(shù)或者增加一層判斷。
底層平臺中的各種定制點越來越多傻谁,邏輯越來越復雜孝治,很難有人能夠通過代碼就知道業(yè)務流程是如何運行的,在新增需求時审磁,只能通過不斷的增加補丁的方式來實現(xiàn)谈飒,原來的代碼沒人敢改動。結(jié)果就是中臺的響應越來越慢态蒂,效能越來越低杭措,低效貫穿了整個研發(fā)過程,包括需求評審與設(shè)計(無法準確評估系統(tǒng)的樣子钾恢,只能先去試試看)瓤介,功能開發(fā)吕喘,測試(隨便一些小改動都需要大量回歸驗證赘那,以免影響到其他業(yè)務)刑桑,發(fā)布以及線上維護。
了解設(shè)計模式的都知道可以通過策略模式來將不同的定制邏輯放到專屬的地方募舟,但是這樣只是代碼結(jié)構(gòu)好看些祠斧,問題的關(guān)鍵是定制邏輯沒有統(tǒng)一的判斷邏輯,無法知道某個業(yè)務方會使用哪種策略拱礁。為了解決這個問題琢锋,于是引入了統(tǒng)一判斷邏輯:業(yè)務身份。為每個業(yè)務方分配一個業(yè)務身份呢灶,并且強制所有定制邏輯都必須根據(jù)身份來區(qū)分差異吴超,并且將差異放到每個業(yè)務的專屬地方,業(yè)務方只能修改專屬代碼鸯乃。
將所有的業(yè)務方的訂正邏輯都放置到業(yè)務的專屬代碼塊中就形成了下面的結(jié)構(gòu)鲸阻。
重構(gòu)之后的平臺難點在于如何制定定制點,如果定制點的粒度太大缨睡,把整個金額計算邏輯全部扔給業(yè)務方定制鸟悴,就失去了平臺的功能,沒有了復用的價值奖年,如果定制點粒度太小细诸,對于業(yè)務方開發(fā)來說理解成本較大,看到的都是一個個離散的點陋守,無法感知整體邏輯震贵。
為了實現(xiàn)功能的復用以及擴展點過多的問題,于是在業(yè)務定制上面增加不同場景下默認實現(xiàn)水评,例如業(yè)務A與業(yè)務C都支持紅包猩系,那么A與C中就需要定制一份與紅包相關(guān)的邏輯,這里紅包的邏輯就可以當成一個默認往上抽取一層之碗,然后基于這個默認實現(xiàn)再制定業(yè)務定制點蝙眶,業(yè)務A與業(yè)務C修改這層默認定制點就好了。
系統(tǒng)到這個階段已經(jīng)越來越復雜了褪那,業(yè)務混亂的問題解決了幽纷,被隔離到了業(yè)務自己的代碼塊中了,但是系統(tǒng)本身層次的增加博敬,對于代碼的閱讀與理解帶來了很大的成本友浸,代碼的流程不斷在不同的層級之間切換,模型也不斷的轉(zhuǎn)換偏窝,跟操作系統(tǒng)中的系統(tǒng)調(diào)用一樣收恢,第一次看完第二次基本也不記得了武学,而對于業(yè)務方來說定制點的理解也是只知其一不知其二,萬一不幸現(xiàn)有的定制點不能滿足業(yè)務述求伦意,那更是傷筋動骨火窒。
對于復用與定制本來就是一個平衡與取舍,如果提供的是大而全的功能驮肉,就會給定制帶來困難熏矿,上面的平臺解決方案就是基于這種模型,在對外大接口下不斷尋求定制的方案离钝,同時也要能盡量的提高復用度票编;另外一種方案就是提供原子能力,然后根據(jù)需求去進行組裝卵渴,然后再根據(jù)業(yè)務的共性進行沉淀慧域。
復用與擴展雖然很難,但是值得探索浪读,去找到一條可以快速支撐業(yè)務以及減少資源投入的解決方案昔榴。