資深架構(gòu)師如何看待大型網(wǎng)站系統(tǒng)架構(gòu)
時間:2022-05-29 05:48:01 | 來源:網(wǎng)絡(luò)營銷
時間:2022-05-29 05:48:01 來源:網(wǎng)絡(luò)營銷
目前,網(wǎng)絡(luò)上關(guān)于討論網(wǎng)站系統(tǒng)架構(gòu)實操(術(shù))的文章較多,討論架構(gòu)理念(道)的較少,本文基于幾位資深架構(gòu)師在大型電商網(wǎng)站系統(tǒng)架構(gòu)方面的一些實踐和思考,和大家聊聊架構(gòu)理念性的東西,希望能夠拋磚引玉,推進(jìn)大家對架構(gòu)的認(rèn)識。
什么是道,什么是術(shù)?道是事物發(fā)展的本質(zhì)規(guī)律,術(shù)是事物發(fā)展的具體途徑。規(guī)律只有一個,途徑很多,條條大路通羅馬,羅馬是道,大路是術(shù)。道為本,術(shù)為途,如果事先知道羅馬在哪里,那么遍地是路,路路相通。架構(gòu)也是如此,如果能領(lǐng)悟架構(gòu)的本質(zhì),就不會拘泥于現(xiàn)有的實踐和理論框框,而以最直接的方式解決問題,無招勝有招。
1、架構(gòu)的本質(zhì) 任何系統(tǒng),自然情況下,都是從有序到無序,這是有科學(xué)依據(jù)的,按照熱力學(xué)第二定律,自然界的一切自發(fā)過程都有方向性,一個孤立系統(tǒng)會由有序變?yōu)闊o序,即它的熵會不斷增加,最終寂滅,但生物可以通過和外界交互,主動進(jìn)行新陳代謝,制造“負(fù)熵”來保證自身有序,繼續(xù)生存。
同樣,一個軟件系統(tǒng)隨著功能越來越多,調(diào)用量急劇增長,整個系統(tǒng)逐漸碎片化,越來越無序,最終無法維護(hù)和擴展,所以系統(tǒng)在一段時間的野蠻生長后,也需要及時干預(yù),避免越來越無序。
架構(gòu)的本質(zhì)就是對系統(tǒng)進(jìn)行有序化重構(gòu),不斷減少系統(tǒng)的“熵”,使系統(tǒng)不斷進(jìn)化。
那架構(gòu)是如何實現(xiàn)無序到有序的呢?基本的手段就是分和合,先把系統(tǒng)打散,然后重新組合。
分的過程是把系統(tǒng)拆分為各個子系統(tǒng)/模塊/組件,拆的時候,首先要解決每個組件的定位問題,然后才能劃分彼此的邊界,實現(xiàn)合理的拆分,合就是根據(jù)最終要求,把各個分離的組件有機整合在一起,相對來說,第一步的拆分更難。
拆分的結(jié)果使開發(fā)人員能夠做到業(yè)務(wù)聚焦、技能聚焦,實現(xiàn)開發(fā)敏捷,合的結(jié)果是系統(tǒng)變得柔性,可以因需而變,實現(xiàn)業(yè)務(wù)敏捷。
舉個例子,在Web 1.0時代,一個ASP或JSP頁面里,HTML和腳本代碼混在一起,此時腳本代碼越多,系統(tǒng)越混亂(即熵增加),最終連開發(fā)者自己都無法理解,此時就需要對系統(tǒng)重新架構(gòu),辦法是引入view helper模式,分離HTML和腳本,HTML成為view,腳本成為幫助類,然后再簡單整合在一起。
通過重新分和合,整個系統(tǒng)層次清晰,職責(zé)明確,系統(tǒng)的無序度降低,容易擴展,同時不同技能的開發(fā)人員,如UED和程序員,可以負(fù)責(zé)不同部分,有效提高開發(fā)效率。
好的架構(gòu)就像一篇優(yōu)美的散文,形散神不散,表面看無序,實則高度有序。
2、架構(gòu)分類和服務(wù)對象 架構(gòu)一般可分業(yè)務(wù)架構(gòu)、應(yīng)用架構(gòu)、技術(shù)架構(gòu),那么它們分別解決什么問題,服務(wù)于誰呢?我們首先看一個系統(tǒng)落地過程:
對于負(fù)責(zé)開發(fā)的人來說,怕的是業(yè)務(wù)太復(fù)雜,代碼邏輯太亂,超出他能理解的范疇,系統(tǒng)無法維護(hù),因此開發(fā)的需求是系統(tǒng)整體概念清晰,容易理解,方便擴展。
對于負(fù)責(zé)運行的機器來說,怕的是業(yè)務(wù)并發(fā)量太大,系統(tǒng)核心資源不夠用(如數(shù)據(jù)庫連接),它希望在業(yè)務(wù)量增加時,系統(tǒng)能夠支持水平擴展,支持硬件容錯(如避免單點故障)。
開發(fā)的痛點主要由業(yè)務(wù)架構(gòu)和應(yīng)用架構(gòu)解決,業(yè)務(wù)架構(gòu)從概念層面幫助開發(fā)理解系統(tǒng)(動態(tài)的包括業(yè)務(wù)流程/節(jié)點/輸入輸出,靜態(tài)的包括業(yè)務(wù)域/業(yè)務(wù)模塊/單據(jù)模型)。
應(yīng)用架構(gòu)從邏輯層面幫助開發(fā)落地系統(tǒng)(應(yīng)用種類/應(yīng)用形式/數(shù)據(jù)交互關(guān)系/交互方式等),整個系統(tǒng)邏輯上容易理解,最近大家談的比較多的 SOA 即屬于應(yīng)用架構(gòu)的范疇。
機器的痛點主要由技術(shù)架構(gòu)解決,如技術(shù)平臺選型(操作系統(tǒng)/中間件/設(shè)備等),部署上希望支持多機房,水平擴展,無單點等。
強調(diào)一下,系統(tǒng)是人的系統(tǒng),架構(gòu)首先是為人服務(wù)的,業(yè)務(wù)概念清晰、應(yīng)用邏輯合理、人好理解是第一位的(即系統(tǒng)有序度高),現(xiàn)在大家討論更多的是技術(shù)架構(gòu),如高并發(fā)設(shè)計,分布式事務(wù)處理等,只是因為這個不需要業(yè)務(wù)上下文背景,比較好相互溝通,具體架構(gòu)設(shè)計時,首先要關(guān)注業(yè)務(wù)架構(gòu)和應(yīng)用架構(gòu),這個架構(gòu)新手要特別注意(具體可查看億企邦《如何搭建垂直門戶網(wǎng)站的內(nèi)容層次架構(gòu)》的相關(guān)介紹)。
3、整體架構(gòu) 真實中的網(wǎng)站架構(gòu)也許并不如此也可以實現(xiàn)高性能,但是高性能的網(wǎng)站莫不過如此,如下圖所示:
(1)、負(fù)載均衡系統(tǒng) 負(fù)載均衡系統(tǒng)分為硬件和軟件兩種。
硬件負(fù)載均衡效率高,但是價格貴,比如F5等。
軟件負(fù)載均衡系統(tǒng)價格較低或者免費,效率較硬件負(fù)載均衡系統(tǒng)低,不過對于流量一般或稍大些網(wǎng)站來講也足夠使用,比如lvs。
(2)、反向代理系統(tǒng) 目前普遍使用Squid或者nginx,或者Lighttpd,Varish。
這四者又各自有很大的差異。
Squid:主要用來做反向代理,使用內(nèi)存+硬盤。
Nginx:可以反向代理+負(fù)載均衡+WWW解析。
Lighttpd:反向代理能力一般,處理FastCGI比較好,消耗內(nèi)存很小。
Varish:主要做內(nèi)存的反向代理,性能最優(yōu)。
(3)、Web服務(wù)器系統(tǒng) 由Apache負(fù)責(zé)解析PHP內(nèi)容,也可以用Nginx,或者Lighttpd,相對來說Apache比較穩(wěn)定。
(4)、分布式存儲系統(tǒng) 存儲量很大,經(jīng)常會達(dá)到單臺服務(wù)器無法提供的規(guī)模,比如相冊、視頻等應(yīng)用。因此需要專業(yè)的大規(guī)模存儲系統(tǒng)。
(5)、底層服務(wù)系統(tǒng) 根據(jù)各自需要由C/C++開發(fā)設(shè)計供上層CGI調(diào)用。
(6)、數(shù)據(jù)庫系統(tǒng) ①、使用MySQL數(shù)據(jù)庫,考慮到Web應(yīng)用的數(shù)據(jù)庫讀多寫少的特點,我們主要對讀數(shù)據(jù)庫做了優(yōu)化,提供專用的讀數(shù)據(jù)庫和寫數(shù)據(jù)庫,在應(yīng)用程序中實現(xiàn)讀操作和寫操作分別訪問不同的數(shù)據(jù)庫。
②、使用同步機制實現(xiàn)快速將主庫(寫庫)的數(shù)據(jù)庫復(fù)制到從庫(讀庫),一個主庫對應(yīng)多個從庫,主庫數(shù)據(jù)實時同步到從庫。
③、寫數(shù)據(jù)庫有多臺,每臺都可以提供多個應(yīng)用共同使用,這樣可以解決寫庫的性能瓶頸問題和單點故障問題。
4、架構(gòu)師能力模型 架構(gòu)師只做分和合的事情,但綜合能力要求很高,要求內(nèi)外兼修,下得廚房,上得廳堂,下圖通過典型的架構(gòu)方式介紹一個架構(gòu)師的能力要求:
在此基礎(chǔ)上,架構(gòu)師要有技術(shù)的廣度(多領(lǐng)域知識),又有深度(技術(shù)前瞻),對主流公司的系統(tǒng)設(shè)計非常了解,知道優(yōu)劣長短,碰到實際問題,很快有多種方案可供評估。
抽象思維是架構(gòu)師最重要的能力,架構(gòu)師要善于把實物概念化并歸類,比如面對一個大型的B2C網(wǎng)站,能夠迅速抽象為采購->運營->前臺搜索->下單->履單這幾大塊,對系統(tǒng)分而治之,庖丁解牛,早已目無全牛。
抽象思維是往高層次的總結(jié)升華,由實到虛,而透過問題看本質(zhì)則是由虛到實,往深層次地挖掘,比如看到一段java代碼,知道它在JVM如何執(zhí)行,一個跨網(wǎng)絡(luò)調(diào)用,知道數(shù)據(jù)是如何通過各種介質(zhì)到達(dá)目標(biāo)(操作系統(tǒng)內(nèi)核/網(wǎng)卡端口/電磁介質(zhì)等),透過問題看本質(zhì)使架構(gòu)師能夠敏銳地發(fā)現(xiàn)底層之真實,系統(tǒng)性端到端地思考問題,識別木桶的短板并解決之。
能落地的架構(gòu)才是好架構(gòu),良好的溝通能力確保各方對架構(gòu)達(dá)成共識,愿意采取行動,良好的平衡取舍能力確保架構(gòu)在現(xiàn)有資源約束下是最合理的,理想最終照進(jìn)現(xiàn)實(具體可查看億企邦《一個普通網(wǎng)站發(fā)展成大型網(wǎng)站的架構(gòu)演變歷程》的相關(guān)介紹)。
總結(jié)下,架構(gòu)師的能力要求包括:
兼具技術(shù)的廣度(多領(lǐng)域知識)和深度(技術(shù)前瞻)
兼具思維的高度(抽象思維)和深度(問題到本質(zhì))
兼具感性(溝通)和理性(平衡)
5、架構(gòu)境界 架構(gòu)師從境界上由淺到深可以分為四層:第一看山不是山,第二看山是山,第三看山不是山,第四看山是山。
剛接手項目時,對業(yè)務(wù)不了解,時時被業(yè)務(wù)方冒出的術(shù)語弄得一愣一愣的,如果把現(xiàn)有問題比作山,則是橫看成嶺側(cè)成峰,根本摸不透,此時看山不是山。
經(jīng)過業(yè)務(wù)梳理和對系統(tǒng)深入了解,可以設(shè)計出一個?絲的方案,把各個系統(tǒng)串起來,解決當(dāng)前的問題,對當(dāng)前這個山能夠看清楚全貌,此時能夠做到看山是山。
通過進(jìn)一步抽象,發(fā)現(xiàn)問題的本質(zhì),原來這個問題是共性的,后續(xù)還會有很多類似問題。設(shè)計上進(jìn)行總結(jié)和升華,得出一個通用的方案,不光能解決當(dāng)前的問題,還可以解決潛在的問題,此時看到的已經(jīng)是問題本質(zhì),看山不是山。
最后回到問題本身,去除過度的抽象,給出的設(shè)計簡潔明了,增之一分嫌肥,減之一分嫌瘦,既解決當(dāng)前問題,又保留最基本的擴展,此時問題還是那個問題,山還是那個山。
第一境界給不出合適方案,不表。
第二境界的方案只解決表面問題,往往設(shè)計不夠,碰到其它類似問題或者問題稍微變形,系統(tǒng)需要重新做。
第三境界的方案往往過度設(shè)計,太追求通用化會創(chuàng)造出過多抽象,生造概念,理解和實現(xiàn)均困難,此時系統(tǒng)的無序度反而增加,過猶不及。
第四境界的方案,在了解問題本質(zhì)的基礎(chǔ)上,同時考慮現(xiàn)狀,評估未來,不多做,不少做。
佛教講空和色,色即事物現(xiàn)象,空即事物本質(zhì),從這個意義上說,第一重境界無色無空,第二重境界過色,第三重境界過空,第四重境界站在色和空之間,既色又空,不執(zhí)著于當(dāng)前,不虛無于未來。
不空不色,既空既色,道法自然,本性如來,架構(gòu)之髓也。
億企邦點評: 構(gòu)建大型的商業(yè)網(wǎng)站絕對不可能像構(gòu)建普通的小型網(wǎng)站一樣一蹴而就,需要從嚴(yán)格的軟件工程管理的角度進(jìn)行認(rèn)真規(guī)劃,有步驟有邏輯地進(jìn)行開發(fā),對于大型網(wǎng)站來說,所采用的技術(shù)涉及面極其廣泛,從硬件到軟件、編程語言、數(shù)據(jù)庫、Web服務(wù)器、防火墻等各個領(lǐng)域都有了很高的要求,已經(jīng)不是原來簡單的html靜態(tài)網(wǎng)站所能比擬的,所以要想對自己有所提升,就必須學(xué)會搭建科學(xué)的系統(tǒng)架構(gòu)。