一篇文章了解架构设计的本质
“
大型網(wǎng)站的架構(gòu)設(shè)計(jì),涉及到的面非常多,并不像大家想象的那樣,就是一個網(wǎng)站這么簡單,今天拋磚引玉,希望大家正確看待架構(gòu)設(shè)計(jì)。
什么是架構(gòu)設(shè)計(jì)的本質(zhì)?
任何系統(tǒng),自然情況下,都是從有序到無序,這是有科學(xué)依據(jù)的, 按照熱力學(xué)第二定律,自然界的一切自發(fā)過程都有方向性,一個孤立系統(tǒng)會由有序變?yōu)闊o序,即它的熵會不斷增加,最終寂滅。但生物可以通過和外界交互,主動進(jìn)行新陳代謝,制造“負(fù)熵”來保證自身有序,繼續(xù)生存。
同樣,一個軟件系統(tǒng)隨著功能越來越多,調(diào)用量急劇增長,整個系統(tǒng)逐漸碎片化,越來越無序,最終無法維護(hù)和擴(kuò)展,所以系統(tǒng)在一段時間的野蠻生長后,也需要及時干預(yù),避免越來越無序。
架構(gòu)的本質(zhì)就是對系統(tǒng)進(jìn)行有序化重構(gòu),不斷減少系統(tǒng)的“熵”,使系統(tǒng)不斷進(jìn)化。
那架構(gòu)是如何實(shí)現(xiàn)無序到有序的呢? 基本的手段就是分和合,先把系統(tǒng)打散,然后重新組合。
分的過程是把系統(tǒng)拆分為各個子系統(tǒng)/模塊/組件,拆的時候,首先要解決每個組件的定位問題,然后才能劃分彼此的邊界,實(shí)現(xiàn)合理的拆分。合就是根據(jù)最終要求,把各個分離的組件有機(jī)整合在一起,相對來說,第一步的拆分更難。
拆分的結(jié)果使開發(fā)人員能夠做到業(yè)務(wù)聚焦、技能聚焦,實(shí)現(xiàn)開發(fā)敏捷,合的結(jié)果是系統(tǒng)變得柔性,可以因需而變,實(shí)現(xiàn)業(yè)務(wù)敏捷。
架構(gòu)設(shè)計(jì)的能力
我們要想做好一個架構(gòu)的話需要哪些能力?我覺得最重要的是架構(gòu)師一個最重要的能力就是你要有分解能力。
第一,你必須要有抽象的能力,抽象的能力最基本就是去重,去重在整個架構(gòu)中體現(xiàn)在方方面面,從定義一個函數(shù),到定義一個類,到提供的一個服務(wù),以及模板,背后都是要去重提高可復(fù)用率。
第二, 分類能力。做軟件需要做對象的解耦,要定義對象的屬性和方法,做分布式系統(tǒng)的時候要做服務(wù)的拆分和模塊化,要定義服務(wù)的接口和規(guī)范。
第三, 算法(性能),它的價值體現(xiàn)在提升系統(tǒng)的性能,所有性能的提升,最終都會落到CPU,內(nèi)存,IO和網(wǎng)絡(luò)這4大塊上。
架構(gòu)設(shè)計(jì)的演變過程
架構(gòu)設(shè)計(jì)的演變,其實(shí)就要清楚整個大型網(wǎng)站技術(shù)架構(gòu)的演變歷程,知道每個階段的瓶頸在哪里,以及對應(yīng)的解決方案。
很多公司都是小做到大,特別是創(chuàng)業(yè)公司,如果一步步發(fā)展起來,網(wǎng)站架構(gòu)演變都會經(jīng)歷這些步驟,請重點(diǎn)注意順序。
架構(gòu)演變第一步:物理分離webserver和數(shù)據(jù)庫
架構(gòu)演變第二步:增加頁面緩存
架構(gòu)演變第三步:增加頁面片段緩存
架構(gòu)演變第四步:數(shù)據(jù)緩存
架構(gòu)演變第五步: 增加webserver(集群)
架構(gòu)演變第六步:分庫(首先考慮)
架構(gòu)演變第七步:分表、DAL和分布式緩存
架構(gòu)演變第八步:增加更多的webserver
架構(gòu)演變第九步:數(shù)據(jù)讀寫分離和廉價存儲方案
架構(gòu)演變第十步:進(jìn)入大型分布式應(yīng)用時代和廉價服務(wù)器群夢想時代
架構(gòu)知識體系
隨著互聯(lián)網(wǎng)技術(shù)迅速發(fā)展和演變,不斷改變的商業(yè)化應(yīng)用系統(tǒng)越來越復(fù)雜,由單一的應(yīng)用架構(gòu)到垂直的應(yīng)用架構(gòu),但還是面臨的擴(kuò)容的問題。
流量分散在各個系統(tǒng)中,雖然體積可控,但對開發(fā)人員和維護(hù)人員帶來極麻煩。此時,將核心的業(yè)務(wù)單獨(dú)提煉出來作為單獨(dú)的系統(tǒng)對外提供服務(wù)。達(dá)成業(yè)務(wù)之間復(fù)用,系統(tǒng)也將演變成分布式系統(tǒng)架構(gòu)。
大型網(wǎng)站最終都會走向大型分布式業(yè)務(wù)場景
分層:橫向分層:應(yīng)用層,服務(wù)層,數(shù)據(jù)層
分割:縱向分割:拆分功能和服務(wù)
分布式
分布式應(yīng)用和服務(wù)
分布式靜態(tài)資源
分布式數(shù)據(jù)和存儲
集群:提高并發(fā)和可用性
緩存:優(yōu)化系統(tǒng)性能
cdn
方向代理訪問資源
本地緩存
分布式緩存
異步:降低系統(tǒng)的耦合性
冗余:冷備和熱備,保證系統(tǒng)的可用性
自動化:發(fā)布,測試,部署,監(jiān)控,報警,失效轉(zhuǎn)移,故障恢復(fù)
安全等。
分布式緩存
高并發(fā)環(huán)境下,大量的讀寫請求涌向數(shù)據(jù)庫,磁盤的處理速度與內(nèi)存顯然不在一個量級,從減輕數(shù)據(jù)庫的壓力和提高系統(tǒng)響應(yīng)速度兩個角度來考慮,一般都會在數(shù)據(jù)庫之前加一層緩存。由于單臺機(jī)器的內(nèi)存資源以及承載能力有限,并且,如果大量使用本地緩存,也會使相同的數(shù)據(jù)被不同的節(jié)點(diǎn)存儲多份,對內(nèi)存資源造成較大的浪費(fèi),因此,才催生出了分布式緩存。
分布式緩存系統(tǒng)
memcached ,redis,動態(tài)、靜態(tài)數(shù)據(jù)的緩存,這里會涉及到:一致性hash算法、分布式session、數(shù)據(jù)復(fù)制多份、單臺緩存失效、集群間能夠自動復(fù)制和備份等知識點(diǎn)。
CDN
全稱:Content Delivery Network或Content Ddistribute Network,即內(nèi)容分發(fā)網(wǎng)絡(luò)基本。通過在網(wǎng)絡(luò)各處放置節(jié)點(diǎn)服務(wù)器所構(gòu)成的在現(xiàn)有的互聯(lián)網(wǎng)基礎(chǔ)之上的一層智能虛擬網(wǎng)絡(luò),CDN系統(tǒng)能夠?qū)崟r地根據(jù)網(wǎng)絡(luò)流量和各節(jié)點(diǎn)的連接、負(fù)載狀況以及到用戶的距離和響應(yīng)時間等綜合信息將用戶的請求重新導(dǎo)向離用戶最近的服務(wù)節(jié)點(diǎn)上。
現(xiàn)在大型互聯(lián)網(wǎng)公司都建立由屬于自己的CDN基站,也有第三方專注于CDN的基站等。
主要特點(diǎn):
1、本地Cache加速,提高了企業(yè)站點(diǎn)(尤其含有大量圖片和靜態(tài)頁面站點(diǎn))的訪問速度,并大大提高以上性質(zhì)站點(diǎn)的穩(wěn)定性
2、鏡像服務(wù)消除了不同運(yùn)營商之間互聯(lián)的瓶頸造成的影響,實(shí)現(xiàn)了跨運(yùn)營商的網(wǎng)絡(luò)加速,保證不同網(wǎng)絡(luò)中的用戶都能得到良好的訪問質(zhì)量。
3、遠(yuǎn)程加速 遠(yuǎn)程訪問用戶根據(jù)DNS負(fù)載均衡技術(shù) 智能自動選擇Cache服務(wù)器,選擇最快的Cache服務(wù)器,加快遠(yuǎn)程訪問的速度
4、帶寬優(yōu)化 自動生成服務(wù)器的遠(yuǎn)程Mirror(鏡像)cache服務(wù)器,遠(yuǎn)程用戶訪問時從cache服務(wù)器上讀取數(shù)據(jù),減少遠(yuǎn)程訪問的帶寬、分擔(dān)網(wǎng)絡(luò)流量、減輕原站點(diǎn)WEB服務(wù)器負(fù)載等功能。
5、集群抗攻擊 廣泛分布的CDN節(jié)點(diǎn)加上節(jié)點(diǎn)之間的智能冗余機(jī)制,可以有效地預(yù)防黑客入侵以及降低各種D.D.o.S攻擊對網(wǎng)站的影響,同時保證較好的服務(wù)質(zhì)量 。
說了這么多,你也可以理解為自動分發(fā)的緩存系統(tǒng),把圖片等消耗資源的都從CDN進(jìn)行訪問。
持久化儲存
Hbase、MySQL、Redis傳統(tǒng)的IOE方案: IBM小型機(jī)Oracle數(shù)據(jù)庫 EMC持久儲存成本很高。
以后會涉及到廉價存儲方案(小型機(jī)太貴了),這塊以后我會講到。
數(shù)據(jù)庫拆分
一般先分庫,如果分庫后查詢?nèi)匀宦?#xff0c;于是按照分庫的思想開始做分表的工作數(shù)據(jù)庫采用分布式數(shù)據(jù)庫(所有節(jié)點(diǎn)的數(shù)據(jù)加起來才算是整體數(shù)據(jù)),文件系統(tǒng)采用分布式文件系統(tǒng)任何強(qiáng)大的單一服務(wù)器都滿足不了大型系統(tǒng)持續(xù)增長的業(yè)務(wù)需求,數(shù)據(jù)庫讀寫分離隨著業(yè)務(wù)的發(fā)展最終也將無法滿足需求,需要使用分布式數(shù)據(jù)庫及分布式文件系統(tǒng)來支撐。
分布式數(shù)據(jù)庫是系統(tǒng)數(shù)據(jù)庫拆分的最后方法,只有在單表數(shù)據(jù)規(guī)模非常龐大的時候才使用,更常用的數(shù)據(jù)庫拆分手段是業(yè)務(wù)分庫,將不同的業(yè)務(wù)數(shù)據(jù)庫部署在不同的物理服務(wù)器上。
比如淘寶中期開始的數(shù)據(jù)庫端按照業(yè)務(wù)垂直拆分:按照業(yè)務(wù)交易數(shù)據(jù)庫、用戶數(shù)據(jù)庫、商品數(shù)據(jù)庫、店鋪數(shù)據(jù)庫等進(jìn)行拆分。
還有就是水平擴(kuò)展,分庫分表,再結(jié)合讀寫分離一起。當(dāng)然,分庫分表需要涉及到對應(yīng)的SQL路由規(guī)則主庫備庫等,淘寶設(shè)計(jì)了一套TDDL來解決這些問題,應(yīng)用端只需配置對應(yīng)的規(guī)則即可,對應(yīng)用端的沒有任何侵入的設(shè)計(jì)。
消息系統(tǒng)
消息隊(duì)列中間件是分布式系統(tǒng)中重要的組件,主要解決應(yīng)用耦合,異步消息,流量削鋒等問題。實(shí)現(xiàn)高性能,高可用,可伸縮和最終一致性架構(gòu)。是大型分布式系統(tǒng)不可缺少的中間件。
目前使用較多的消息隊(duì)列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。
消息系統(tǒng)使用場景
典型的 異步處理,應(yīng)用解耦,流量削鋒和消息通訊四個場景。
除了以上還要設(shè)計(jì)運(yùn)維(掌握分布式并行計(jì)算、報表、監(jiān)控技術(shù)以及規(guī)則策略),安全、運(yùn)營、服務(wù)、存儲、業(yè)務(wù)拆分、機(jī)房容災(zāi)等等,要做好一個大型的網(wǎng)站真的很不容易。
你可能也喜歡:
總結(jié)
以上是生活随笔為你收集整理的一篇文章了解架构设计的本质的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论文浅尝 - WSDM2020 | QA
- 下一篇: 研讨会 | CCF TF 第 17 期: