業(yè)務(wù)層,到底需不需要服務(wù)化?架構(gòu)師之路關(guān)注共 1671字,需瀏覽 4分鐘 ·2020-11-07 05:44 很多公司,都實施了微服務(wù)架構(gòu),底層抽象出很多基礎(chǔ)數(shù)據(jù)服務(wù)。基礎(chǔ)數(shù)據(jù)的訪問服務(wù)化之后,架構(gòu)如上:(1)站點業(yè)務(wù)通過RPC接口,調(diào)用基礎(chǔ)數(shù)據(jù)服務(wù);(2)基礎(chǔ)數(shù)據(jù)服務(wù)通過DAO,從db/cache獲取數(shù)據(jù);(3)db/cache存儲數(shù)據(jù);?除了基礎(chǔ)數(shù)據(jù)的訪問需要服務(wù)化,業(yè)務(wù)層是否需要服務(wù)化?如果需要,什么時機進行服務(wù)化?這是本文要討論的兩個問題。隨著時間的推移,系統(tǒng)架構(gòu)并不會一成不變:(1)隨著業(yè)務(wù)越來越復(fù)雜,業(yè)務(wù)會不斷進行垂直拆分;畫外音:以58同城為例,有招聘、房產(chǎn)、二手、二手車、黃頁等多個業(yè)務(wù)。(2)隨著數(shù)據(jù)越來越復(fù)雜,基礎(chǔ)數(shù)據(jù)服務(wù)也會越來越多;畫外音,例如:用戶服務(wù),訂單服務(wù),搜索服務(wù),推薦服務(wù)等。?于是系統(tǒng)架構(gòu)變成了上圖這個樣子,業(yè)務(wù)垂直拆分,有若干個基礎(chǔ)數(shù)據(jù)服務(wù):(1)垂直業(yè)務(wù)要通過多個RPC接口訪問不同的基礎(chǔ)數(shù)據(jù)服務(wù),服務(wù)共享是服務(wù)化的特征;(2)每個基礎(chǔ)數(shù)據(jù)服務(wù)訪問自己的數(shù)據(jù)存儲,數(shù)據(jù)私有也是服務(wù)化的特征;?上面架構(gòu)圖中的依賴關(guān)系是不是看上去很別扭?(1)基礎(chǔ)數(shù)據(jù)服務(wù)與存儲層之間連接關(guān)系很清晰;(2)業(yè)務(wù)站點層與基礎(chǔ)數(shù)據(jù)服務(wù)層之間的連接關(guān)系錯綜復(fù)雜,變成了蜘蛛網(wǎng);?再舉一個更具體的例子,58同城列表頁站點如何獲取底層的數(shù)據(jù)?(1)首先調(diào)用商業(yè)基礎(chǔ)服務(wù),獲取商業(yè)廣告帖子數(shù)據(jù),用于頂部置頂/精準的廣告帖子展示;(2)再調(diào)用搜索基礎(chǔ)服務(wù),獲取自然搜索帖子數(shù)據(jù),用于中間自然搜索帖子展示;(3)再調(diào)用推薦基礎(chǔ)服務(wù),獲取推薦帖子數(shù)據(jù),用于底部推薦帖子展示;(4)再調(diào)用用戶基礎(chǔ)服務(wù),獲取用戶數(shù)據(jù),用于右側(cè)用戶信息展示;(5)…?如果只有一個列表頁這么寫還行,但如果有招聘、房產(chǎn)、二手、二手車、黃頁等多個業(yè)務(wù),都這么獲取共性數(shù)據(jù),而只有少部分個性數(shù)據(jù),每次都這么一個個調(diào)用基礎(chǔ)服務(wù),有大量冗余、重復(fù)、每次必寫的代碼。?特別的,不同業(yè)務(wù)上游列表頁都依賴于底層若干相同服務(wù):(1)一旦一個服務(wù)RPC接口有稍許變化,所有上游的系統(tǒng)都需要升級修改;(2)子系統(tǒng)之間很可能出現(xiàn)代碼拷貝;(3)一旦拷貝代碼,出現(xiàn)一個bug,多個子系統(tǒng)都需要升級修改;?如何讓數(shù)據(jù)的獲取更加高效快捷呢?業(yè)務(wù)服務(wù)化,通用業(yè)務(wù)服務(wù)層的抽象勢在必行。?通過抽象通用業(yè)務(wù)服務(wù)層,例如58同城“通用列表服務(wù)”:(1)業(yè)務(wù)站點層,可以通過RPC接口,像調(diào)用本地函數(shù)一樣,調(diào)用通用業(yè)務(wù)服務(wù),一次性獲取所有通用數(shù)據(jù);(2)通用業(yè)務(wù)服務(wù),也可以通過多次調(diào)用基礎(chǔ)數(shù)據(jù)服務(wù)提供的RPC接口,分別獲取數(shù)據(jù),底層數(shù)據(jù)獲取的復(fù)雜性,全都屏蔽在了此處;是不是連接關(guān)系也看起來更清晰?這樣的好處是:(1)復(fù)雜的從基礎(chǔ)服務(wù)獲取數(shù)據(jù)代碼,只有在通用業(yè)務(wù)服務(wù)處寫了一次,沒有代碼拷貝;(2)底層基礎(chǔ)數(shù)據(jù)服務(wù)接口發(fā)生變化,只有通用業(yè)務(wù)服務(wù)一處需要升級修改;(3)如果有bug,不管是底層基礎(chǔ)數(shù)據(jù)服務(wù)的bug,還是通用業(yè)務(wù)服務(wù)的bug,都只有一處需要升級修改;(4)業(yè)務(wù)站點層獲取數(shù)據(jù)更便捷,獲取所有數(shù)據(jù),只需一個RPC接口調(diào)用;?于是,當(dāng)業(yè)務(wù)越來越復(fù)雜,垂直拆分的系統(tǒng)越來越多,基礎(chǔ)數(shù)據(jù)服務(wù)越來越多,底層數(shù)據(jù)獲取復(fù)雜性成為通用痛點的時候,就應(yīng)該抽象出通用業(yè)務(wù)服務(wù),簡化數(shù)據(jù)獲取過程,提高數(shù)據(jù)獲取效率,向上游屏蔽底層的復(fù)雜性。?最后再強調(diào)兩點:(1)是否需要抽象通用業(yè)務(wù)服務(wù),和業(yè)務(wù)復(fù)雜性,以及業(yè)務(wù)發(fā)展階段有關(guān),不可一概而論;畫外音:如果沒有多個業(yè)務(wù)線,大概率基礎(chǔ)服務(wù)就夠用。(2)需要抽象什么通用業(yè)務(wù)服務(wù),和具體業(yè)務(wù)相關(guān);畫外音:帖子列表業(yè)務(wù)服務(wù),帖子詳情業(yè)務(wù)服務(wù),是58同城特有的;而基礎(chǔ)服務(wù),例如用戶,訂單,支付等基礎(chǔ)服務(wù),基本上各個公司是類似的。?任何脫離業(yè)務(wù)的架構(gòu)設(shè)計,都是耍流氓。調(diào)研:(1)貴司有沒有基礎(chǔ)服務(wù)?(2)貴司有沒有業(yè)務(wù)服務(wù)? 瀏覽 29點贊 評論 收藏 分享 手機掃一掃分享分享 舉報 評論圖片表情視頻評價全部評論推薦 前端項目到底需不需要 TypeScript ?趣談前端0到底需不需要購物車?看完本文就懂了明天上線0“李子柒”們的商業(yè)模式,到底需不需要微念科技新知0離婚需不需要找律師?Nevermindressing0去二十四橋景點需不需要門票?二十四橋景點是沒有設(shè)定單獨門票的,但是進入瘦西湖風(fēng)景區(qū)需要門票,瘦西湖景區(qū)門票價格為30~100元,不需要不需要0不需要不需要0Basil.jsJavaScript 數(shù)據(jù)持久化層Basil.js 是一個 JavaScript 的數(shù)據(jù)持久化層庫,實現(xiàn)了統(tǒng)一的 LocalStoraBasil.jsJavaScript 數(shù)據(jù)持久化層Basil.js是一個JavaScript的數(shù)據(jù)持久化層庫,實現(xiàn)了統(tǒng)一的LocalStorage、Cookie和Session存儲。基本使用:basil?=?new?window.Basil(opti理解CNN卷積層與池化層計算小白學(xué)視覺0點贊 評論 收藏 分享 手機掃一掃分享分享 舉報