互聯(lián)網(wǎng)分層架構(gòu)的本質(zhì)

上圖是一個(gè)典型的互聯(lián)網(wǎng)分層架構(gòu):
- 客戶(hù)端層:典型調(diào)用方是browser或者APP
- 站點(diǎn)應(yīng)用層:實(shí)現(xiàn)核心業(yè)務(wù)邏輯,從下游獲取數(shù)據(jù),對(duì)上游返回html或者json
- 數(shù)據(jù)-緩存層:加速訪問(wèn)存儲(chǔ)
- 數(shù)據(jù)-數(shù)據(jù)庫(kù)層:固化數(shù)據(jù)存儲(chǔ)
如果實(shí)施了服務(wù)化,這個(gè)分層架構(gòu)圖可能是這樣:
中間多了一個(gè)服務(wù)層。
同一個(gè)層次的內(nèi)部,例如端上的APP,以及web-server,也都有進(jìn)行MVC分層:
- view層:展現(xiàn)
- control層:邏輯
- model層:數(shù)據(jù)
可以看到,每個(gè)工程師骨子里,都潛移默化的實(shí)施著分層架構(gòu)。
那么,互聯(lián)網(wǎng)分層架構(gòu)的本質(zhì)究竟是什么呢?
如果我們仔細(xì)思考會(huì)發(fā)現(xiàn),不管是跨進(jìn)程的分層架構(gòu),還是進(jìn)程內(nèi)的MVC分層,都是一個(gè)“數(shù)據(jù)移動(dòng)”,然后“被處理”和“被呈現(xiàn)”的過(guò)程,歸根結(jié)底一句話:互聯(lián)網(wǎng)分層架構(gòu),是一個(gè)數(shù)據(jù)移動(dòng),處理,呈現(xiàn)的過(guò)程,其中數(shù)據(jù)移動(dòng)是整個(gè)過(guò)程的核心。
如上圖所示:
數(shù)據(jù)處理和呈現(xiàn)要CPU計(jì)算,CPU是固定不動(dòng)的:
- db/service/web-server都部署在固定的集群上
- 端上,不管是browser還是APP,也有固定的CPU處理
數(shù)據(jù)是移動(dòng)的:
- 跨進(jìn)程移動(dòng):數(shù)據(jù)從數(shù)據(jù)庫(kù)和緩存里,轉(zhuǎn)移到service層,到web-server層,到client層
- 同進(jìn)程移動(dòng):數(shù)據(jù)從model層,轉(zhuǎn)移到control層,轉(zhuǎn)移到view層
數(shù)據(jù)要移動(dòng),所以有兩個(gè)東西很重要:
- 數(shù)據(jù)傳輸?shù)母袷?/li>
- 數(shù)據(jù)在各層次的形態(tài)
先看數(shù)據(jù)傳輸?shù)母袷剑磪f(xié)議很重要:
- service與db/cache之間,二進(jìn)制協(xié)議/文本協(xié)議是數(shù)據(jù)傳輸?shù)妮d體
- web-server與service之間,RPC的二進(jìn)制協(xié)議是數(shù)據(jù)傳輸?shù)妮d體
- client和web-server之間,http協(xié)議是數(shù)據(jù)傳輸?shù)妮d體
再看數(shù)據(jù)在各層次的形態(tài),以用戶(hù)數(shù)據(jù)為例:
- db層,數(shù)據(jù)是以“行”為單位存在的row(uid, name, age)
- cache層,數(shù)據(jù)是以kv的形式存在的kv(uid -> User)
- service層,會(huì)把row或者kv轉(zhuǎn)化為對(duì)程序友好的User對(duì)象
- web-server層,會(huì)把對(duì)程序友好的User對(duì)象轉(zhuǎn)化為對(duì)http友好的json對(duì)象
- client層:最終端上拿到的是json對(duì)象
結(jié)論:互聯(lián)網(wǎng)分層架構(gòu)的本質(zhì),是數(shù)據(jù)的移動(dòng)。
為什么要說(shuō)這個(gè),這將會(huì)引出“分層架構(gòu)演進(jìn)”的核心原則與方法:
- 讓上游更高效的獲取與處理數(shù)據(jù),復(fù)用
- 讓下游能屏蔽數(shù)據(jù)的獲取細(xì)節(jié),封裝
弄清楚這個(gè)原則與方法,再加上一些經(jīng)驗(yàn)積累,就能回答網(wǎng)友經(jīng)常在評(píng)論中提出的這些問(wèn)題了:
- 是否需要引入DAO層,什么時(shí)機(jī)引入
- 是否需要服務(wù)化,什么時(shí)機(jī)服務(wù)化
- 是否需要抽取通用中臺(tái)業(yè)務(wù),什么時(shí)機(jī)抽取
- 是否需要前后端分離,什么時(shí)機(jī)分離
(網(wǎng)友們的這些提問(wèn),其實(shí)很難回答。在不了解業(yè)務(wù)發(fā)展階段,業(yè)務(wù)規(guī)模,數(shù)據(jù)量并發(fā)量的情況下,妄下YES或NO的結(jié)論,本身就是不負(fù)責(zé)任的。)
更具體的分層架構(gòu)演進(jìn)細(xì)節(jié),下一篇和大家細(xì)究。
總結(jié)
- 互聯(lián)網(wǎng)分層架構(gòu)的本質(zhì),是數(shù)據(jù)的移動(dòng)
- 互聯(lián)網(wǎng)分層架構(gòu)中,數(shù)據(jù)的傳輸格式(協(xié)議)與數(shù)據(jù)在各層次的形態(tài)很重要
- 互聯(lián)網(wǎng)分層架構(gòu)演進(jìn)的核心原則與方法:封裝與復(fù)用
思考
哪一個(gè)系統(tǒng)的架構(gòu),不是“固定CPU,移動(dòng)數(shù)據(jù)”,而是“固定數(shù)據(jù),移動(dòng)CPU”呢?
【本文為51CTO專(zhuān)欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】
































