問題來自于我和同事在一個(gè)跨系統(tǒng)交互設(shè)計(jì)上的分歧。
目前創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、射陽網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。同事的設(shè)計(jì),基本上是這樣的:
這種設(shè)計(jì)很常見,其基本思路就是:服務(wù)端接口需要什么數(shù)據(jù),客戶端就傳入什么數(shù)據(jù)。這種設(shè)計(jì)的優(yōu)點(diǎn)在于簡單:開發(fā)簡單,交互簡單。但是它的缺點(diǎn)也很明顯:擴(kuò)展性低。一旦服務(wù)端對(duì)某個(gè)業(yè)務(wù)中的業(yè)務(wù)-數(shù)據(jù)依賴關(guān)心進(jìn)行了修改,則客戶端很可能也要跟著修改。例如,如果系統(tǒng)B中,完成業(yè)務(wù)B1需要的數(shù)據(jù)不再是D1而是D3,則不光系統(tǒng)B要改,系統(tǒng)A也要改。如果還有系統(tǒng)C/D/E/F也調(diào)用了這個(gè)接口,那么這些系統(tǒng)都面臨著修改代碼的風(fēng)險(xiǎn)。
實(shí)際上,不僅僅是系統(tǒng)間的服務(wù),在系統(tǒng)內(nèi)部服務(wù)的設(shè)計(jì)上,這種思路也很常見。我曾經(jīng)見過一個(gè)用作金額計(jì)算的類。它的計(jì)算公式是a+b/c-d^e,而它對(duì)外暴露的方法居然就是public BigDecimal calculate(BigDecimal a, BigDecimal b, BigDecimal c, BigDecimal d, BigDecimal e)。當(dāng)公式需要擴(kuò)展為a+b/c-d^e-f時(shí),其中的麻煩可想而知。
造成這種風(fēng)險(xiǎn)、麻煩的原因就在于:這個(gè)設(shè)計(jì)不僅簡單的實(shí)現(xiàn)了客戶端對(duì)服務(wù)端的業(yè)務(wù)依賴,而且將服務(wù)端內(nèi)部的控制依賴也暴露、延伸到了客戶端。
客戶端對(duì)服務(wù)端的依賴,是一種業(yè)務(wù)上的“正向”依賴。沒有服務(wù)端提供的服務(wù),客戶端的業(yè)務(wù)也無法正常的進(jìn)行下去。
但是,我們?cè)谧鲈O(shè)計(jì)的時(shí)候,不應(yīng)當(dāng)簡單的臨摹業(yè)務(wù)流程。業(yè)務(wù)流程從A到B,系統(tǒng)設(shè)計(jì)就畫兩個(gè)方框+一個(gè)箭頭;這是在為現(xiàn)在的自己偷懶。更不應(yīng)當(dāng)把業(yè)務(wù)流程中的依賴關(guān)系過度的延伸出去;這簡直是在為三個(gè)月后的自己挖墳。
對(duì)這一個(gè)系統(tǒng)的設(shè)計(jì),我的觀點(diǎn)就是:系統(tǒng)B把業(yè)務(wù)-數(shù)據(jù)間的依賴關(guān)系全部收到自己的系統(tǒng)中去。如下圖。
即,客戶端在調(diào)用時(shí),提供一個(gè)數(shù)據(jù)主鍵。服務(wù)端根據(jù)自己的業(yè)務(wù)需要,按主鍵去查詢出所需的數(shù)據(jù)。
這樣做的缺點(diǎn)是復(fù)雜。代碼會(huì)復(fù)雜,交互也更復(fù)雜。由于多了一次交互,性能上會(huì)有下降。另外在分布式事務(wù)方面還有一點(diǎn)小隱患。
但是這樣的優(yōu)點(diǎn),恰恰就是易于擴(kuò)展。只要新業(yè)務(wù)所需數(shù)據(jù)仍然落在數(shù)據(jù)集合D內(nèi),那么系統(tǒng)A無需任何改動(dòng)。
帶來這個(gè)優(yōu)點(diǎn)的,就是依賴倒置。雖然在業(yè)務(wù)上,是客戶端依賴于服務(wù)端的功能;但是在設(shè)計(jì)上,是服務(wù)端依賴于客戶端的數(shù)據(jù)。并且,這種依賴只是簡單的數(shù)據(jù)依賴。這也是所謂的“好萊塢法則”:Don't call me, I'll call you!
實(shí)際上,同事的設(shè)計(jì)和我的設(shè)計(jì),在我們的系統(tǒng)中都已經(jīng)有了實(shí)踐。到目前為止的結(jié)果,是按同事的思路設(shè)計(jì)的另一個(gè)系統(tǒng)服務(wù)已經(jīng)經(jīng)過了二次改造,歸入我的思路中了。而按我的思路設(shè)計(jì)的另一個(gè)系統(tǒng)服務(wù),目前在做性能上的優(yōu)化。
遺憾的是,我沒有說服他。他仍然堅(jiān)持己見,只是在客戶端調(diào)用接口時(shí),將數(shù)據(jù)集合D一次性提交到服務(wù)端。
這種思路算一個(gè)折中。但是,如果服務(wù)端所需數(shù)據(jù)集超過了數(shù)據(jù)D呢?按他的方案,客戶端仍然需要修改;按我的方案,在客戶端沒有開通對(duì)應(yīng)的查詢接口時(shí)也需要修改。只不過,客戶端是我負(fù)責(zé)的系統(tǒng)(也許這也是我一直跟他爭執(zhí)的原因之一吧),而這個(gè)系統(tǒng)中,已經(jīng)規(guī)劃了“每個(gè)資源都應(yīng)有查詢服務(wù)”。
附,分布式事務(wù)上的一點(diǎn)小隱患在于:如果在客戶端調(diào)用服務(wù)端的那個(gè)事務(wù)中,主鍵key所對(duì)應(yīng)的數(shù)據(jù)有部分還未提交,那么,通過查詢接口是無法查詢到這部分?jǐn)?shù)據(jù)的。彌補(bǔ)措施是在服務(wù)接口中把這一部分?jǐn)?shù)據(jù)傳過來,作為“優(yōu)先”配置或數(shù)據(jù),覆蓋查詢接口中查到的結(jié)果。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。