偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

互聯(lián)網(wǎng)分層架構(gòu)之DAO與服務(wù)化

開(kāi)發(fā) 開(kāi)發(fā)工具
互聯(lián)網(wǎng)分層架構(gòu)的本質(zhì),是數(shù)據(jù)的移動(dòng)。那么,什么時(shí)候進(jìn)行DAO層的抽象,什么時(shí)候進(jìn)行數(shù)據(jù)服務(wù)層的抽象?

互聯(lián)網(wǎng)分層架構(gòu)的本質(zhì),是數(shù)據(jù)的移動(dòng)。

互聯(lián)網(wǎng)分層架構(gòu)演進(jìn)的核心原則:

  • 讓上游更高效的獲取與處理數(shù)據(jù),復(fù)用
  • 讓下游能屏蔽數(shù)據(jù)的獲取細(xì)節(jié),封裝

這些在上一篇《互聯(lián)網(wǎng)分層架構(gòu)的本質(zhì)》中有詳盡的描述,在實(shí)際系統(tǒng)架構(gòu)演進(jìn)過(guò)程中,如何利用這兩個(gè)原則,對(duì)系統(tǒng)逐步進(jìn)行分層抽象呢?咱們先從后端系統(tǒng)開(kāi)始講解。

本文主要解答兩個(gè)問(wèn)題:

  • 后端架構(gòu),什么時(shí)候進(jìn)行DAO層的抽象
  • 后端架構(gòu),什么時(shí)候進(jìn)行數(shù)據(jù)服務(wù)層的抽象

核心問(wèn)題一:什么時(shí)候進(jìn)行DAO層的抽象

一個(gè)業(yè)務(wù)系統(tǒng)最初的后端結(jié)構(gòu)如上:

  • web-server層從db層獲取數(shù)據(jù)并進(jìn)行加工處理
  • db層存儲(chǔ)數(shù)據(jù)

此時(shí),web-server層如何獲取底層的數(shù)據(jù)呢?

web-server層獲取數(shù)據(jù)的一段偽代碼如上,不用糾結(jié)代碼的細(xì)節(jié),也不用糾結(jié)不同編程語(yǔ)言與不同數(shù)據(jù)庫(kù)驅(qū)動(dòng)的差異,其獲取數(shù)據(jù)的過(guò)程大致為:

  • 創(chuàng)建一個(gè)與數(shù)據(jù)庫(kù)的連接,初始化資源
  • 根據(jù)業(yè)務(wù)拼裝一個(gè)SQL語(yǔ)句
  • 通過(guò)連接執(zhí)行SQL語(yǔ)句,并獲得結(jié)果集
  • 通過(guò)游標(biāo)遍歷結(jié)果集,取出每行數(shù)據(jù),亦可從每行數(shù)據(jù)中取出屬性數(shù)據(jù)
  • 關(guān)閉數(shù)據(jù)庫(kù)連接,回收資源

如果業(yè)務(wù)不復(fù)雜,這段代碼寫(xiě)1次2次還可以,但如果業(yè)務(wù)越來(lái)越復(fù)雜,每次都這么獲取數(shù)據(jù),就略顯低效了,有大量冗余、重復(fù)、每次必寫(xiě)的代碼。

如何讓數(shù)據(jù)的獲取更加高效快捷呢?

如何讓數(shù)據(jù)的獲取更加高效快捷呢?

通過(guò)技術(shù)手段實(shí)現(xiàn):

  • 表與類(lèi)的映射
  • 屬性與成員的映射
  • SQL與函數(shù)的映射

絕大部分公司正在用的ORM,DAO等技術(shù),就是一種分層抽象,可以提高數(shù)據(jù)獲取的效率,屏蔽連接,游標(biāo),結(jié)果集這些復(fù)雜性。

結(jié)論

當(dāng)手寫(xiě)代碼從DB中獲取數(shù)據(jù),成為通用痛點(diǎn)的時(shí)候,就應(yīng)該抽象出DAO層,簡(jiǎn)化數(shù)據(jù)獲取過(guò)程,提高數(shù)據(jù)獲取效率,向上游屏蔽底層的復(fù)雜性。

核心問(wèn)題二:什么時(shí)候要進(jìn)行數(shù)據(jù)服務(wù)層的抽象

抽象出DAO層之后,系統(tǒng)架構(gòu)并不會(huì)一成不變:

  • 隨著業(yè)務(wù)越來(lái)越復(fù)雜,業(yè)務(wù)系統(tǒng)會(huì)不斷進(jìn)行垂直拆分
  • 隨著數(shù)據(jù)量越來(lái)越大,數(shù)據(jù)庫(kù)會(huì)進(jìn)行水平切分
  • 隨著讀并發(fā)的越來(lái)越大,會(huì)增加緩存降低數(shù)據(jù)庫(kù)的壓力

于是系統(tǒng)架構(gòu)變成了這個(gè)樣子:

業(yè)務(wù)系統(tǒng)垂直拆分,數(shù)據(jù)庫(kù)水平切分,緩存這些都是常見(jiàn)的架構(gòu)優(yōu)化手段。

此時(shí),web-server層如何獲取底層的數(shù)據(jù)呢?

根據(jù)樓主的經(jīng)驗(yàn),以用戶(hù)數(shù)據(jù)為例,流程一般是這樣的:

  • 先查緩存:先用uid嘗試從緩存獲取數(shù)據(jù),如果cache hit,數(shù)據(jù)獲取成功,返回User實(shí)體,流程結(jié)束
  • 確定路由:如果cache miss,先查詢(xún)路由配置,確定uid落在哪個(gè)數(shù)據(jù)庫(kù)實(shí)例的哪個(gè)庫(kù)上
  • 查詢(xún)DB:通過(guò)DAO從對(duì)應(yīng)庫(kù)獲取uid對(duì)應(yīng)的數(shù)據(jù)實(shí)體User
  • 插入緩存:將kv(uid, User)放入緩存,以便下次緩存查詢(xún)數(shù)據(jù)能夠命中緩存

如果業(yè)務(wù)不復(fù)雜,這段代碼寫(xiě)1次2次還可以,但如果業(yè)務(wù)越來(lái)越復(fù)雜,每次都這么獲取數(shù)據(jù),就略顯低效了,有大量冗余、重復(fù)、每次必寫(xiě)的代碼。

特別的,業(yè)務(wù)垂直拆分成非常多的子系統(tǒng)之后:

  • 一旦底層有稍許變化,所有上游的系統(tǒng)都需要升級(jí)修改
  • 子系統(tǒng)之間很可能出現(xiàn)代碼拷貝
  • 一旦拷貝代碼,出現(xiàn)一個(gè)bug,多個(gè)子系統(tǒng)都需要升級(jí)修改

不相信業(yè)務(wù)會(huì)垂直拆分成多個(gè)子系統(tǒng)?舉兩個(gè)例子:

  • 58同城有招聘、房產(chǎn)、二手、二手車(chē)、黃頁(yè)等5大頭部業(yè)務(wù),都需要訪(fǎng)問(wèn)用戶(hù)數(shù)據(jù)
  • 58到家有月嫂、保姆、麗人、速運(yùn)、平臺(tái)等多個(gè)業(yè)務(wù),也都需要訪(fǎng)問(wèn)用戶(hù)數(shù)據(jù)

如果每個(gè)子系統(tǒng)都需要關(guān)注緩存,分庫(kù),讀寫(xiě)分離的復(fù)雜性,調(diào)用層會(huì)瘋掉的。

如何讓數(shù)據(jù)的獲取更加高效快捷呢?

服務(wù)化,數(shù)據(jù)服務(wù)層的抽象勢(shì)在必行。

通過(guò)抽象數(shù)據(jù)服務(wù)層:

  • web-server層可以通過(guò)RPC接口,像調(diào)用本地函數(shù)一樣調(diào)用遠(yuǎn)端的數(shù)據(jù)
  • 數(shù)據(jù)服務(wù)層,只有這一處需要關(guān)注緩存,分庫(kù),讀寫(xiě)分離這些復(fù)雜性

服務(wù)化這里就不展開(kāi),更詳細(xì)的可參考《互聯(lián)網(wǎng)架構(gòu)為什么要做服務(wù)化?》。

結(jié)論

當(dāng)業(yè)務(wù)越來(lái)越復(fù)雜,垂直拆分的系統(tǒng)越來(lái)越多,數(shù)據(jù)庫(kù)實(shí)施了水平切分,數(shù)據(jù)層實(shí)施了緩存加速之后,底層數(shù)據(jù)獲取復(fù)雜性成為通用痛點(diǎn)的時(shí)候,就應(yīng)該抽象出數(shù)據(jù)服務(wù)層,簡(jiǎn)化數(shù)據(jù)獲取過(guò)程,提高數(shù)據(jù)獲取效率,向上游屏蔽底層的復(fù)雜性。

互聯(lián)網(wǎng)分層架構(gòu)是一個(gè)很有意思的問(wèn)題,服務(wù)化的引入,并不是越早越好:

  • 請(qǐng)求處理時(shí)間可能會(huì)增加
  • 運(yùn)維可能會(huì)更加復(fù)雜
  • 定位問(wèn)題可能會(huì)更加麻煩

千萬(wàn)別魯莽的在“微服務(wù)”大流之下,草率的進(jìn)行微服務(wù)改造,看似“高大上架構(gòu)”的背后,隱藏著更多并未接觸過(guò)的“大坑”。還是那句話(huà),架構(gòu)和業(yè)務(wù)的特點(diǎn)和階段有關(guān):一切脫離業(yè)務(wù)的架構(gòu)設(shè)計(jì),都是耍流氓。

這一篇先到這里,分層架構(gòu),還有很多內(nèi)容要和大家聊:

  • 后端架構(gòu),是否需要抽取中臺(tái)業(yè)務(wù),什么時(shí)機(jī)抽取
  • 后端架構(gòu),是否需要前后端分離,什么時(shí)機(jī)分離
  • 前端架構(gòu),如何進(jìn)行分層實(shí)踐

末了,再次強(qiáng)調(diào)下,互聯(lián)網(wǎng)分層架構(gòu)的本質(zhì),是數(shù)據(jù)的移動(dòng)。

互聯(lián)網(wǎng)分層架構(gòu)演進(jìn)的核心原則,是讓上游更高效的獲取與處理數(shù)據(jù),讓下游能屏蔽掉數(shù)據(jù)的復(fù)雜性獲取細(xì)節(jié)。

【本文為51CTO專(zhuān)欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2017-10-15 14:36:10

互聯(lián)網(wǎng)分層架構(gòu)服務(wù)化

2020-08-11 09:43:28

分層架構(gòu)互聯(lián)網(wǎng)架構(gòu)

2020-09-29 07:42:34

互聯(lián)網(wǎng)分層架構(gòu)前后端分離

2017-11-06 08:41:53

互聯(lián)網(wǎng)分層架構(gòu)前后端

2016-09-22 15:01:59

微服務(wù)互聯(lián)網(wǎng)架構(gòu)

2018-11-07 06:35:50

互聯(lián)網(wǎng)服務(wù)化高可用架構(gòu)

2016-09-22 14:22:53

互聯(lián)網(wǎng)

2018-08-15 09:02:59

產(chǎn)業(yè)互聯(lián)網(wǎng)工業(yè)互聯(lián)網(wǎng)物聯(lián)網(wǎng)

2020-08-13 09:22:11

MapReduce分層架構(gòu)架構(gòu)

2017-08-03 16:37:35

互聯(lián)網(wǎng)法院司法

2013-01-22 18:32:43

2013-01-23 09:09:31

2011-08-19 11:33:32

2015-06-24 15:35:54

2021-03-09 10:02:40

996互聯(lián)網(wǎng)商業(yè)

2017-05-29 08:30:42

互聯(lián)網(wǎng)智能廣告架構(gòu)

2014-10-11 09:16:59

互聯(lián)網(wǎng)協(xié)議

2019-09-02 16:12:16

工業(yè)互聯(lián)網(wǎng)智能制造體系架構(gòu)

2012-09-18 13:58:58

互聯(lián)網(wǎng)創(chuàng)業(yè)架構(gòu)

2014-01-15 14:35:35

云計(jì)算
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)