大型网站技术架构:摘要与读书笔记
花了幾個(gè)晚上看完了《大型網(wǎng)站技術(shù)架構(gòu)》(https://book.douban.com/subject/25723064/)這本書(shū),個(gè)人感覺(jué)這本書(shū)的廣度還行,深度還有些欠缺(畢竟只有200頁(yè)左右)。但是作為一個(gè)缺乏大型網(wǎng)站技術(shù)的IT民工,看完一遍還是很有收獲的,至少對(duì)一個(gè)網(wǎng)站的技術(shù)演進(jìn)、需要解決的問(wèn)題有了一個(gè)全面的認(rèn)識(shí)。文中也有一些作者個(gè)人的心得、感悟、總結(jié),我覺(jué)得還是很中肯的。
在網(wǎng)上一搜,這本書(shū)的讀書(shū)筆記還是很多的,而我自己還是決定寫(xiě)一篇讀書(shū)筆記,主要是為了避免自己忘得太快。筆記的內(nèi)容并不完全按照原書(shū)的內(nèi)容,主要記錄的是我自己感興趣的部分。
一個(gè)網(wǎng)站的進(jìn)化史
作者反復(fù)在文中提到一個(gè)觀點(diǎn):大型網(wǎng)站是根據(jù)業(yè)務(wù)需求逐步演化而來(lái)的,而不是設(shè)計(jì)出來(lái)的。
不得不承認(rèn),互聯(lián)網(wǎng)行業(yè)發(fā)展到了今天,大魚(yú)吃小魚(yú)還是很普遍的,大公司的微創(chuàng)新能力分分鐘就能干死一個(gè)小的項(xiàng)目,所以小公司需要足夠快的發(fā)展,不停的快速迭代與試錯(cuò)。
下面是是一個(gè)演化的過(guò)程,圖片來(lái)自網(wǎng)絡(luò)。
初始階段的網(wǎng)站架構(gòu)
在初始階段,訪問(wèn)量并不大,所以應(yīng)用程序、數(shù)據(jù)庫(kù)、文件等所有的資源都在一臺(tái)服務(wù)器上。
應(yīng)用服務(wù)和數(shù)據(jù)服務(wù)分離
隨著業(yè)務(wù)的發(fā)展,就會(huì)發(fā)現(xiàn)一臺(tái)服務(wù)器抗不過(guò)來(lái)了,所以將應(yīng)用服務(wù)器與數(shù)據(jù)(文件、數(shù)據(jù)庫(kù))服務(wù)器分離。三臺(tái)服務(wù)器對(duì)硬件資源的要求各不相同:應(yīng)用服務(wù)器需要更快的CPU,文件服務(wù)器需要更大的磁盤(pán)和帶寬,數(shù)據(jù)庫(kù)服務(wù)器需要更快速的磁盤(pán)和更大的內(nèi)存。分離之后,三個(gè)服務(wù)器各司其職,也方便針對(duì)性的優(yōu)化。
使用緩存改善網(wǎng)站性能
“世界上沒(méi)有什么問(wèn)題是加一級(jí)緩存解決不了的,如果有那就再加一級(jí)緩存”
緩存的使用無(wú)處不在,緩存的根本目的是加快訪問(wèn)速度。當(dāng)數(shù)據(jù)庫(kù)的訪問(wèn)壓力過(guò)大的時(shí)候,就可以考慮使用緩存了。網(wǎng)站使用的緩存可以分為兩種: 緩存在應(yīng)用服務(wù)器上的本地緩存和緩存在專門(mén)的分布式緩存服務(wù)器上的遠(yuǎn)程緩存。
使用應(yīng)用服務(wù)器集群改善網(wǎng)站的并發(fā)處理能力
隨著業(yè)務(wù)的發(fā)展,單個(gè)應(yīng)用服務(wù)器一定會(huì)成為瓶頸,應(yīng)用服務(wù)器實(shí)現(xiàn)集群是網(wǎng)站可伸縮集群架構(gòu)設(shè)計(jì)中較為簡(jiǎn)單成熟的一種。后面也會(huì)提到,將應(yīng)用服務(wù)器設(shè)計(jì)為無(wú)狀態(tài)的(沒(méi)有需要保存的上下文信息),就可以通過(guò)增加機(jī)器,使用負(fù)載均衡來(lái)scale out。
數(shù)據(jù)庫(kù)讀寫(xiě)分離
即使使用了緩存,但在緩存未命中、或者緩存服務(wù)時(shí)效的情況下,還是需要訪問(wèn)數(shù)據(jù)庫(kù),這個(gè)時(shí)候就需要數(shù)據(jù)庫(kù)的讀寫(xiě)分離:主庫(kù)提供寫(xiě)操作,從庫(kù)提供讀服務(wù)。注意,在上圖中增加了一個(gè)數(shù)據(jù)訪問(wèn)模塊,可以對(duì)應(yīng)用層透明數(shù)據(jù)庫(kù)的主從分離信息。
使用反向代理和CDN 加速網(wǎng)站晌應(yīng)
CDN和反向代理其實(shí)都是緩存,區(qū)別在于CDN 部署在網(wǎng)絡(luò)提供商的機(jī)房;而反向代理則部署在網(wǎng)站的中心機(jī)房。使用CDN 和反向代理的目的都是盡旱返回?cái)?shù)據(jù)給用戶, 一方面加快用戶訪問(wèn)速度,另一方面也減輕后端服務(wù)器的負(fù)載壓力。
使用分布式文件系統(tǒng)和分布式數(shù)據(jù)庫(kù)系統(tǒng)
單個(gè)物理機(jī)的磁盤(pán)是有限的,單個(gè)關(guān)系數(shù)據(jù)庫(kù)的處理能力也是有上限的,所以需要分布式文件存儲(chǔ)與分布式數(shù)據(jù)庫(kù)。當(dāng)然,也需要”統(tǒng)一數(shù)據(jù)訪問(wèn)模塊“,使得應(yīng)用層不用關(guān)心文件、數(shù)據(jù)的具體位置。值得一提的事,關(guān)系型數(shù)據(jù)庫(kù)自身并沒(méi)有很好的水平擴(kuò)展方案,因此一般都需要一個(gè)數(shù)據(jù)庫(kù)代理層,如cobar、mycat。
使用NoSQL 和搜索引擎
web2.0的很多應(yīng)用并一定適合用關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ),更加靈活的NoSql能更加方便的解決一些問(wèn)題,而且NoSQL天然就支持分布式。專門(mén)的搜索引擎在提供更優(yōu)質(zhì)服務(wù)的同時(shí),也大大減輕了數(shù)據(jù)庫(kù)的壓力。
業(yè)務(wù)拆分
將一個(gè)網(wǎng)站拆分成許多不同的應(yīng)用, 每個(gè)應(yīng)用獨(dú)立部署維護(hù)。應(yīng)用之間可以通過(guò)一個(gè)超鏈接建立關(guān)系(在首頁(yè)上的導(dǎo)航鏈接每個(gè)都指向不同的應(yīng)用地址) ,也可以通過(guò)消息隊(duì)列進(jìn)行數(shù)據(jù)分發(fā), 當(dāng)然最多的還是通過(guò)訪問(wèn)同一個(gè)數(shù)據(jù)存儲(chǔ)系統(tǒng)來(lái)構(gòu)成一個(gè)關(guān)聯(lián)的完整系統(tǒng)
分布式服務(wù)
既然每一個(gè)應(yīng)用系統(tǒng)都需要執(zhí)行許多相同的業(yè)務(wù)操作, 比如用戶管理、商品管理等,那么可以將這些共用的業(yè)務(wù)提取出來(lái),獨(dú)立部署。
通過(guò)服務(wù)的分布式,各個(gè)應(yīng)用能更好的獨(dú)立發(fā)展,實(shí)現(xiàn)了從依賴模塊到依賴服務(wù)的過(guò)渡。將通用的公共服務(wù)獨(dú)立出來(lái),也方便做服務(wù)管控,比如對(duì)各個(gè)應(yīng)用的服務(wù)請(qǐng)求進(jìn)行監(jiān)控,在高峰時(shí)期限制、關(guān)閉某些應(yīng)用的訪問(wèn)等。
大型網(wǎng)站架構(gòu)模式與核心要素
這一部分是說(shuō)大型網(wǎng)站需要解決的核心問(wèn)題,以及解決這些問(wèn)題的常規(guī)思路。
核心要素
五個(gè)要點(diǎn):性能,可用性,伸縮性,擴(kuò)展性,安全
作者指出,很多時(shí)候大家都混淆了伸縮性(Scalability)與擴(kuò)展性(Extensibility)。我以前也是把Scalability稱之為擴(kuò)展性,不過(guò)想想,在我們講代碼質(zhì)量的時(shí)候,擴(kuò)展性也是指Extensibility,以后還是直接說(shuō)這兩個(gè)英文單詞好了。
這幾點(diǎn)后面會(huì)詳細(xì)介紹。
網(wǎng)站架構(gòu)模式
對(duì)模式的定義,書(shū)中描述得很好:
" 每一個(gè)模式描述了一個(gè)在我們周?chē)粩嘀貜?fù)發(fā)生的問(wèn)題及該問(wèn)題解決方案的核心。這樣, 你就能一次又一次地使用該方案而不必做重復(fù)工作" 。模式的關(guān)鍵在于模式的可重復(fù)性, 問(wèn)題與場(chǎng)景的可重復(fù)性帶來(lái)解決方案的可重復(fù)使用。
用我自己的話來(lái)說(shuō),模式就是套路。這些模式,都是為了達(dá)成上面提到的核心要素。那么,有哪些模式呢
分層
分層是企業(yè)應(yīng)用系統(tǒng)中最常見(jiàn)的一種架構(gòu)模式,將系統(tǒng)在橫向維度上切分成幾個(gè)部分,每個(gè)部分負(fù)責(zé)一部分相對(duì)比較單一的職責(zé), 然后通過(guò)上層對(duì)下層的依賴和調(diào)用組成一個(gè)完整的系統(tǒng)。
在大型網(wǎng)站架構(gòu)中也采用分層結(jié)構(gòu),將網(wǎng)主占軟件系統(tǒng)分為應(yīng)用層、服務(wù)層、數(shù)據(jù)層。
分層的好處在于:解耦合,獨(dú)立發(fā)展,伸縮性,可擴(kuò)展性。上面網(wǎng)站的進(jìn)化史也凸出了分層的重要性。
但是分層架構(gòu)也有一些挑戰(zhàn), 就是必須合理規(guī)劃層次邊界和接口,在開(kāi)發(fā)過(guò)程中,嚴(yán)格遵循分層架構(gòu)的約束, 禁止跨層次的調(diào)用( 應(yīng)用層直接調(diào)用數(shù)據(jù)層)及逆向調(diào)用(數(shù)據(jù)層調(diào)用服務(wù)層, 或者服務(wù)層調(diào)用應(yīng)用層)。
分割
分層強(qiáng)調(diào)的是橫向切分,而分割是縱向切分, 上面網(wǎng)站進(jìn)化史部分的業(yè)務(wù)拆分就包含了分割。
分割的目標(biāo)是高內(nèi)聚、低耦合的模塊單元
分布式
分層和分割的一個(gè)主要目的是分布式部署,但分布式也有自己的問(wèn)題:網(wǎng)絡(luò)通信帶來(lái)的性能問(wèn)題,可用性,一致性與分布式事務(wù),系統(tǒng)維護(hù)管理復(fù)雜度。
集群
一個(gè)機(jī)器解決不了的問(wèn)題,就用幾個(gè)機(jī)器來(lái)解決,當(dāng)服務(wù)無(wú)狀態(tài)的時(shí)候,通過(guò)往集群增加機(jī)器就能解決大部分問(wèn)題。對(duì)應(yīng)網(wǎng)站進(jìn)化史中“使用應(yīng)用服務(wù)器集群改善網(wǎng)站的并發(fā)處理能力”
緩存
緩存就是將數(shù)據(jù)存放在距離計(jì)算最近的位置以加快處理速度,同時(shí)大大減輕了數(shù)據(jù)提供者的壓力
大型網(wǎng)站架構(gòu)設(shè)計(jì)在很多方面都使用了緩存設(shè)計(jì):CDN、反向代理、本地緩存、分布式緩存
異步
異步是解耦合的一個(gè)重要手段,常見(jiàn)的生產(chǎn)者-消費(fèi)者模型就是一個(gè)異步模式。
出了解耦合,異步還能提高系統(tǒng)可用性、加快響應(yīng)速度、流量削峰
冗余
冗余是系統(tǒng)可用性的重要保障,也是數(shù)據(jù)可靠性的重要手段
自動(dòng)化
凡人總是會(huì)出這樣那樣的錯(cuò)誤,能自動(dòng)話的就要自動(dòng)化。自動(dòng)化大大解放了程序員、運(yùn)維人員的生產(chǎn)力!
發(fā)布過(guò)程自動(dòng)化、自動(dòng)化代碼管理、自動(dòng)化測(cè)試、自動(dòng)化安全檢測(cè)、自動(dòng)化部署、自動(dòng)化監(jiān)控、自動(dòng)化報(bào)警、自動(dòng)化失效轉(zhuǎn)移、自動(dòng)化失效恢復(fù)、自動(dòng)化降級(jí)。
性能
奧運(yùn)精神:更快、更高、更強(qiáng)
技術(shù)人員對(duì)于性能的追求是無(wú)止境的。
性能,站在不同的角度,衡量指標(biāo)是不一樣的:
-
用戶視角:響應(yīng)時(shí)間,優(yōu)化手段:(瀏覽器優(yōu)化,頁(yè)面布局,壓縮文件,http長(zhǎng)鏈接),CND,反向代理
-
開(kāi)發(fā)人員視角:系統(tǒng)延遲、吞吐量、穩(wěn)定性。優(yōu)化手段:緩存,異步,集群,代碼優(yōu)化
-
運(yùn)維視角:基礎(chǔ)設(shè)施性能 資源利用率。優(yōu)化手段:定制骨干網(wǎng)絡(luò)、定制服務(wù)器,虛擬化
常見(jiàn)的衡量標(biāo)準(zhǔn)包括:響應(yīng)時(shí)間、吞吐量、并發(fā)量。關(guān)于這些衡量標(biāo)準(zhǔn),文中有一個(gè)很好的比喻:
系統(tǒng)吞吐量和系統(tǒng)并發(fā)數(shù), 以及響應(yīng)時(shí)間的關(guān)系可以形象地理解為高速公路的通行狀況: 吞吐量是每天通過(guò)收費(fèi)站的車(chē)輛數(shù)目(可以換算成收費(fèi)站收取的高速費(fèi)) , 并發(fā)數(shù)是高速公路上的正在行駛的車(chē)輛數(shù)目,響應(yīng)時(shí)間是車(chē)速。車(chē)輛很少時(shí), 車(chē)速很快, 但是收到的高速費(fèi)也相應(yīng)較少; 隨著高速公路上車(chē)輛數(shù)目的增多,車(chē)速略受影響,但是收到的高速費(fèi)增加很快; 隨著車(chē)輛的繼續(xù)增加,車(chē)速變得越來(lái)越慢,高速公路越來(lái)越堵,收費(fèi)不增反降; 如果車(chē)流量繼續(xù)增加,超過(guò)某個(gè)極限后,任何偶然因素都會(huì)導(dǎo)致高速全部癱瘓, 車(chē)走不動(dòng),費(fèi)當(dāng)然也收不著,而高速公路成了停車(chē)場(chǎng)(資源耗盡)。
#
web前端性能優(yōu)化
瀏覽器優(yōu)化:減少http請(qǐng)求,瀏覽器緩存,壓縮。CDN優(yōu)化,反應(yīng)代理
應(yīng)用服務(wù)器性能優(yōu)化
四招:緩存、集群、異步、代碼優(yōu)化
#
緩存
首先自然是緩存
網(wǎng)站性能優(yōu)化第一定律: 優(yōu)先考慮使用緩存優(yōu)化性能。
使用緩存,需要考慮的是緩存置換與一致性問(wèn)題,其中緩存一致性問(wèn)題也是分布式系統(tǒng)中需要解決的一個(gè)問(wèn)題,主要的解決方法有租期和版本號(hào)。
并不是所有的場(chǎng)合都適合緩存,如頻繁修改的數(shù)據(jù)、沒(méi)有熱點(diǎn)訪問(wèn)的數(shù)據(jù)。
緩存的可用性:理論上不能完全依靠,但事實(shí)上盡可能高可用,否則數(shù)據(jù)庫(kù)宕機(jī)導(dǎo)致系統(tǒng)不可用。因此緩存服務(wù)器也要納入監(jiān)控,盡量高可用。
緩存穿透:如果因?yàn)椴磺‘?dāng)?shù)臉I(yè)務(wù)、或者惡意攻擊持續(xù)高并發(fā)地請(qǐng)求某個(gè)不存在的數(shù)據(jù),由于緩存沒(méi)有保存該數(shù)據(jù), 所有的請(qǐng)求都會(huì)落到數(shù)據(jù)庫(kù)上,會(huì)對(duì)數(shù)據(jù)庫(kù)造成很大壓力,甚至崩橫。一個(gè)簡(jiǎn)單的對(duì)策是將不存在的數(shù)據(jù)也緩存起來(lái)(其value 值為null )。
#
代碼優(yōu)化
-
多線程
-
- 為什么要使用多線程,IO阻塞 與 多核CPU
-
理想的load 是: 即沒(méi)有進(jìn)程(線程)等待,也沒(méi)有CPU空閑
-
啟動(dòng)線程數(shù)= [任務(wù)執(zhí)行時(shí)間/ (任務(wù)執(zhí)行時(shí)間-10 等待時(shí)間)J xCPU 內(nèi)核數(shù)
-
資源復(fù)用
-
- 這個(gè)很常見(jiàn),各種池(pool):線程池、連接池
高可用
網(wǎng)站年度可用性指標(biāo)= ( 1-網(wǎng)站不可用時(shí)間/年度總時(shí)間) x lOO%
業(yè)界通常用N個(gè)9來(lái)衡量系統(tǒng)的可用性。如,2 個(gè)9 是基本可用, 網(wǎng)站年度不可用時(shí)間小于8 8 小時(shí); 3 個(gè)9是較高可用, 網(wǎng)站年度不可用時(shí)間小于9 小時(shí); 4 個(gè)9 是具有自動(dòng)恢復(fù)能力的高可用,網(wǎng)站年度不可用時(shí)間小于53 分鐘; 5 個(gè)9 是極高可用性,網(wǎng)站年度不可用時(shí)間小于5 分鐘。
可用性是大型網(wǎng)站的命脈,是否可用,用戶是可以立刻感知到的,短暫的不可用也會(huì)帶來(lái)巨大的損失。這也是為什么大型網(wǎng)站在面對(duì)CAP問(wèn)題時(shí),更看重A(avalibility)的原因。
高可用架構(gòu)的主要手段是數(shù)據(jù)和服務(wù)的冗余備份及失效轉(zhuǎn)移。
在分層的網(wǎng)絡(luò)架構(gòu)中,通過(guò)保證每一層的高可用,就實(shí)現(xiàn)了整個(gè)系統(tǒng)的高可用。而每一層又有自己的高可用手段
應(yīng)用層高可用
位于應(yīng)用層的服務(wù)器通常為了應(yīng)對(duì)高并發(fā)的訪問(wèn)請(qǐng)求,會(huì)通過(guò)負(fù)載均衡設(shè)備將一組服務(wù)器組成一個(gè)集群共同對(duì)外提供服務(wù),當(dāng)負(fù)載均衡設(shè)備通過(guò)心跳檢測(cè)等手段監(jiān)控到某臺(tái)應(yīng)用服務(wù)器不可用時(shí),就將其從集群列表中剔除,并將請(qǐng)求分發(fā)到集群中其他可用的服務(wù)器上,使整個(gè)集群保持可用,從而實(shí)現(xiàn)應(yīng)用高可用。
應(yīng)用層的高可用很容易,因?yàn)閼?yīng)用服務(wù)器很多時(shí)候是無(wú)狀態(tài)的。
但是也有時(shí)候需要有維護(hù)的數(shù)據(jù),如session,這樣就不能將一個(gè)請(qǐng)求路由到任意的應(yīng)用服務(wù)器。要解決session的問(wèn)題,有以下幾種方法:
-
session綁定:利用負(fù)載均衡的源地址Hash 算法實(shí)現(xiàn),負(fù)載均衡服務(wù)器總是將來(lái)源于同一IP 的請(qǐng)求分發(fā)到同一臺(tái)服務(wù)器上
-
用cookie記錄session:Cookie是存放在客戶端(瀏覽器)的,在每次訪問(wèn)的時(shí)候帶上cookie里面的信息即可
-
專門(mén)的session服務(wù)器:將應(yīng)用服務(wù)器的狀態(tài)分離, 分為無(wú)狀態(tài)的應(yīng)用服務(wù)器和有狀態(tài)的Session。簡(jiǎn)單的方法是利用分布式緩存、數(shù)據(jù)庫(kù)(redis)來(lái)實(shí)現(xiàn)Session服務(wù)器的功能
服務(wù)層的高可用
服務(wù)層的高可用也是利用集群,不過(guò)需要借助分布式服務(wù)調(diào)用框架。
服務(wù)層的服務(wù)器被應(yīng)用層通過(guò)分布式服務(wù)調(diào)用框架訪問(wèn),分布式服務(wù)調(diào)用框架會(huì)在應(yīng)用層客戶端程序中實(shí)現(xiàn)軟件負(fù)載均衡, 并通過(guò)服務(wù)注冊(cè)中心對(duì)提供服務(wù)的服務(wù)器進(jìn)行心跳檢測(cè),發(fā)現(xiàn)有服務(wù)不可用,立即通知客戶端程序修改服務(wù)訪問(wèn)列表,剔除不可用的服務(wù)器。
為了保證服務(wù)層的高可用,可以采用以下策略:
-
分層管理
-
超時(shí)設(shè)置
-
異步調(diào)用
-
服務(wù)降級(jí),包括:拒絕服務(wù),高峰時(shí)段,拒絕低優(yōu)先級(jí)應(yīng)用的訪問(wèn);關(guān)閉服務(wù),關(guān)閉某些不重要的功能
-
冪等性設(shè)計(jì),方便失敗時(shí)重試
數(shù)據(jù)層的高可用
包括分布式文件系統(tǒng)與分布式數(shù)據(jù)庫(kù),核心都是冗余加失效轉(zhuǎn)移。
冗余(復(fù)制集、replica)需要解決的核心問(wèn)題是一致性問(wèn)題
失效轉(zhuǎn)移操作由三部分組成: 失效確認(rèn)、訪問(wèn)轉(zhuǎn)移、數(shù)據(jù)恢復(fù)。
上面描述了失效確認(rèn)的兩種方法:控制中心通過(guò)心跳檢測(cè)存儲(chǔ)服務(wù)器的存活性;應(yīng)用在訪問(wèn)存儲(chǔ)服務(wù)失敗的時(shí)候通知控制中心檢測(cè)存儲(chǔ)服務(wù)存活性
#
伸縮性(Scalability)
網(wǎng)站的伸縮性是指不需要改變網(wǎng)站的軟硬件設(shè)計(jì),僅僅通過(guò)改變部署的服務(wù)器數(shù)量就可以擴(kuò)大或者縮小網(wǎng)站的服務(wù)處理能力。
應(yīng)用層的伸縮性
將應(yīng)用層設(shè)計(jì)成無(wú)狀態(tài),即可利用集群 + 負(fù)載均衡來(lái)解決伸縮性問(wèn)題。
關(guān)于負(fù)載均衡,我之前也寫(xiě)過(guò)一篇文章《關(guān)于負(fù)載均衡的一切:總結(jié)與思考》(http://www.cnblogs.com/xybaby/p/7867735.html)介紹。
緩存的伸縮性
首先,緩存是有狀態(tài)的,分布式緩存服務(wù)器集群中不同服務(wù)器中緩存的數(shù)據(jù)各不相同,緩存訪問(wèn)請(qǐng)求不可以在緩存服務(wù)器集群中的任意一臺(tái)處理,必須先找到緩存有需要數(shù)據(jù)的服務(wù)器,然后才能訪問(wèn)。
如果緩存訪問(wèn)被路由到了沒(méi)有緩存相關(guān)數(shù)據(jù)的服務(wù)器,那么該訪問(wèn)請(qǐng)求就會(huì)落地到數(shù)據(jù)庫(kù),增加數(shù)據(jù)庫(kù)的壓力。因此,必須讓新上線的緩存服務(wù)器對(duì)整個(gè)分布式緩存集群影響最小,即緩存命中率越高越好。
在這個(gè)場(chǎng)景下,最好的負(fù)載均衡算法就是一致性hash
數(shù)據(jù)層的伸縮性
關(guān)系型數(shù)據(jù)庫(kù),依賴于分布式數(shù)據(jù)庫(kù)代理。而NoSQL數(shù)據(jù)庫(kù)產(chǎn)品都放棄了關(guān)系數(shù)據(jù)庫(kù)的兩大重要基礎(chǔ): 以關(guān)系代數(shù)為基礎(chǔ)的結(jié)構(gòu)化查詢語(yǔ)言( SQL ) 和事務(wù)一致性保證( AClD )。而強(qiáng)化其他一些大型網(wǎng)站更關(guān)注的特性: 高可用性和可伸縮性。
伸縮性總結(jié):一個(gè)具有良好伸縮性架構(gòu)設(shè)計(jì)的網(wǎng)站,其設(shè)計(jì)總是走在業(yè)務(wù)發(fā)展的前面, 在業(yè)務(wù)需要處理更多訪問(wèn)和服務(wù)之前,就已經(jīng)做好充足準(zhǔn)備, 當(dāng)業(yè)務(wù)需要時(shí), 只需要購(gòu)買(mǎi)或者租用服務(wù)器簡(jiǎn)單部署實(shí)施就可以。
可擴(kuò)展性(Extensibility)
設(shè)計(jì)網(wǎng)站可擴(kuò)展架構(gòu)的核心思想是模塊化, 并在此基礎(chǔ)之上, 降低模塊間的耦合性,提高模塊的復(fù)用性。
主要有分布式消息隊(duì)列和分布式服務(wù)。
分布式消息隊(duì)列通過(guò)消息對(duì)象分解系統(tǒng)耦合性, 不同子系統(tǒng)處理同一個(gè)消息。
分布式服務(wù)則通過(guò)接口分解系統(tǒng)輯合性, 不同子系統(tǒng)通過(guò)相同的接口描述進(jìn)行服務(wù)調(diào)用。
分布式服務(wù)
縱向拆分:將一個(gè)大應(yīng)用拆分為多個(gè)小應(yīng)用, 如果新增業(yè)務(wù)較為獨(dú)立, 那么就直接將其設(shè)計(jì)部署為一個(gè)獨(dú)立的Web 應(yīng)用系統(tǒng)。
橫向拆分: 將復(fù)用的業(yè)務(wù)拆分出來(lái), 獨(dú)立部署為分布式服務(wù), 新增業(yè)務(wù)只需要調(diào)用這些分布式服務(wù), 不需要依賴具體的模塊代碼,即可快速搭建一個(gè)應(yīng)用系統(tǒng), 而模塊內(nèi)業(yè)務(wù)邏輯變化的時(shí)候, 只要接口保持一致就不會(huì)影響業(yè)務(wù)程序和其他模塊。
分布式服務(wù)依賴于分布式服務(wù)治理框架
分布式服務(wù)治理框架
這一塊兒接觸甚少,還需要花點(diǎn)時(shí)間專門(mén)學(xué)習(xí)學(xué)習(xí)。
服務(wù)治理框架的功能和特點(diǎn):
-
服務(wù)注冊(cè)與發(fā)現(xiàn)
-
服務(wù)調(diào)用
-
負(fù)載均衡
-
失效轉(zhuǎn)移:分布式服務(wù)框架支持服務(wù)提供者的失效轉(zhuǎn)移機(jī)制, 當(dāng)某個(gè)服務(wù)實(shí)例不可用, 就將訪問(wèn)切換到其他服務(wù)實(shí)例上,以實(shí)現(xiàn)服務(wù)整體高可用。
-
高效遠(yuǎn)程通信
-
整合異構(gòu)系統(tǒng)
-
對(duì)應(yīng)用最小侵入
-
版本管理:分布式服務(wù)框架需要支持服務(wù)多版本發(fā)布, 服務(wù)提供者先升級(jí)接口發(fā)布新版本的服務(wù), 并同時(shí)提供舊版本的服務(wù)供請(qǐng)求者調(diào)用, 當(dāng)請(qǐng)求者調(diào)用接口升級(jí)后才可以關(guān)閉舊版本服務(wù)。
-
實(shí)時(shí)監(jiān)控
Others
所謂問(wèn)題, 就是體驗(yàn)一期望,當(dāng)體驗(yàn)不能滿足期望, 就會(huì)覺(jué)得出了問(wèn)題。消除問(wèn)題有兩種手段:改善休驗(yàn)或者降低期望。
問(wèn)題被發(fā)現(xiàn),它只是問(wèn)題發(fā)現(xiàn)者的問(wèn)題,而不是問(wèn)題擁有者的問(wèn)題,如果想要解決一個(gè)問(wèn)題,就必須提出這個(gè)問(wèn)題,讓問(wèn)題的擁有者知道問(wèn)題的存在。
提出問(wèn)題Tips:
把" 我的問(wèn)題" 表述成" 我們的問(wèn)題"
給上司提封閉式問(wèn)題, 給下屬提開(kāi)放式問(wèn)題
指出問(wèn)題而不是批評(píng)人
用贊同的方式提出問(wèn)題 --》不是說(shuō) 你這里有問(wèn)題,而是說(shuō),方案不錯(cuò),我有一點(diǎn)疑問(wèn)(建議)
總結(jié)
以上是生活随笔為你收集整理的大型网站技术架构:摘要与读书笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 七年程序员生涯,我学到的重要六课
- 下一篇: 来,聊聊程序员的爱情