什么是架構(gòu)設(shè)計(jì)的五個(gè)核心要素?
架構(gòu)中五個(gè)重要的核心指標(biāo):分別是性能、可用性、伸縮性、擴(kuò)展性和安全性。
一、性能
性能就是核心要素之一,不然我為什么架構(gòu)設(shè)計(jì)?隨隨便便一個(gè)lowlow的系統(tǒng)上線就好了。所以性能優(yōu)化是很多小公司賣不去過的坎。這么說吧,當(dāng)然優(yōu)化網(wǎng)站性能的手段也非常多:
(1)web前端性能優(yōu)化:
- 瀏覽器訪問優(yōu)化(瀏覽器緩存、頁面壓縮傳輸、合理布局頁面、減少Cookie傳輸)
- 減少http請(qǐng)求。避免建立太多通訊鏈路。將js、css、圖片文件盡可能合并。避免太多請(qǐng)求。同時(shí),對(duì)于系統(tǒng)的后端請(qǐng)求也盡可能進(jìn)行合理的設(shè)計(jì),來避免出現(xiàn)太多交互。
- 使用瀏覽器的緩存。http頭設(shè)置Cache-Control和Expires.js文件名比如可以帶時(shí)間戳。一旦有更新則更新時(shí)間戳,否則緩存;同時(shí)盡量避免同一時(shí)間更新大量靜態(tài)資源。
- 對(duì)靜態(tài)資源進(jìn)行壓縮。
- css放置在頁面最上方,js放下最下面。以提前進(jìn)行css渲染。同時(shí)避免js帶來的頁面阻塞。但需要case by case。比如頁面dom節(jié)點(diǎn)需要依賴js生成,則可視情況改變文件位置。
- 減少cookie傳輸。同時(shí)讓靜態(tài)資源有獨(dú)立域名,發(fā)送靜態(tài)資源請(qǐng)求時(shí)候不發(fā)送cookie。以此減少傳輸代價(jià)。cookie可以通過document.cookie獲取。
2.CDN加速
- 緩存圖片、文件、CSS以及script腳本。但是pc上的CDN加速效果要好于移動(dòng)端。經(jīng)過調(diào)研發(fā)現(xiàn),last-mile的延遲越高,CDN的相對(duì)有效性越差(具體見文章為什么CDN對(duì)移動(dòng)客戶端加速“沒有”效果)。
3.反向代理
- 可以提供七層負(fù)載均衡(http請(qǐng)求進(jìn)行均衡策略),并且可以提供靜態(tài)資源的緩存,請(qǐng)求轉(zhuǎn)發(fā),防止網(wǎng)絡(luò)攻擊等。比較流行的有nginx。
(2)應(yīng)用服務(wù)器性能優(yōu)化:
如果請(qǐng)求靜態(tài)界面不卡了,但是動(dòng)態(tài)數(shù)據(jù)還是卡,說明MySQL處理的請(qǐng)求太多了,可以使用服務(wù)器本地緩存和分布式緩存,也可以通過異步操作方式來加快響應(yīng),在高并發(fā)請(qǐng)求的情況下,可以將多臺(tái)應(yīng)用服務(wù)器組成一個(gè)集群共同對(duì)外服務(wù),提高整體處理能力,改善性能,具體如下:
1.分布式緩存(網(wǎng)站性能優(yōu)化定律:優(yōu)先考慮使用緩存優(yōu)化性能)
- 一般來說,存入cache的數(shù)據(jù)的讀寫比在2:1以上;且應(yīng)該是熱點(diǎn)數(shù)據(jù)。
- 需要考慮如果采用緩存則可能帶來的數(shù)據(jù)短期內(nèi)的不一致,或者如果實(shí)時(shí)更新緩存可能帶來的性能和資源開銷。
- 需要考慮cache一旦失效,大量請(qǐng)求可能帶來的服務(wù)性能雪崩。所以可以對(duì)cache采用集群化部署,以此避免丟失過多數(shù)據(jù)造成服務(wù)壓力陡增。
- 對(duì)于熱點(diǎn)數(shù)據(jù)考慮進(jìn)行緩存的預(yù)熱加載。比如高峰期來臨前,先將熱點(diǎn)數(shù)據(jù)提前存入緩存。以此提高高峰期的服務(wù)性能。
- 為了避免惡意攻擊,一直query不存在的數(shù)據(jù),導(dǎo)致cache頻繁訪問DB,可以將不存在的數(shù)據(jù)也進(jìn)行緩存并定期清理。同時(shí)有機(jī)制對(duì)惡意請(qǐng)求進(jìn)行識(shí)別和封禁。
- 分布式緩存應(yīng)該去中心化并集中管理。通過不同實(shí)例間的互不通信和同構(gòu)來保證可擴(kuò)展性,并降低系統(tǒng)復(fù)雜度。
2.異步化(任何可以晚點(diǎn)做的事情都應(yīng)該晚點(diǎn)再做,感覺像懶加載)
通過分布式消息隊(duì)列來實(shí)現(xiàn)削峰的目的。通過業(yè)務(wù)配合技術(shù)來解決問題。比如12306的排隊(duì)。
3.集群
采用集群也是服務(wù)虛擬化的一個(gè)體現(xiàn)。用以避免單點(diǎn)問題,同時(shí)提供更加高可用,高性能的服務(wù)。
4.代碼優(yōu)化
- 多線程中,如果是密集型計(jì)算,線程數(shù)不宜超過CPU核數(shù)。如果是IO處理,則線程數(shù)=[任務(wù)執(zhí)行時(shí)間/(任務(wù)執(zhí)行時(shí)間-IO等待時(shí)間)] * CPU核數(shù)。除此之外,我們應(yīng)該將對(duì)象設(shè)計(jì)成無狀態(tài)對(duì)象,多采用局部對(duì)象,適當(dāng)將鎖細(xì)化。
- 進(jìn)行資源復(fù)用。比如采用單例模式,比如采用連接池。
- 合理設(shè)置JVM參數(shù),避免不合理的full gc。
5.存儲(chǔ)性能優(yōu)化
關(guān)系型數(shù)據(jù)庫的索引采用B+樹進(jìn)行實(shí)現(xiàn)。而很多的nosql數(shù)據(jù)庫則采用了LSM樹進(jìn)行存儲(chǔ)。LSM在內(nèi)存中保留增刪改查的數(shù)據(jù),直到內(nèi)存無法放下,則與磁盤的下一級(jí)LSM樹進(jìn)行merge。所以對(duì)于寫操作較多,而讀操作更多的是查詢最近寫入數(shù)據(jù)的場(chǎng)景,其性能遠(yuǎn)高于b+樹;采用HDFS結(jié)合map reduce進(jìn)行海量數(shù)據(jù)存儲(chǔ)和分析。其能自動(dòng)進(jìn)行并發(fā)訪問和冗余備份,具有很高的可靠性。其等于是實(shí)現(xiàn)了RAID的功能。
(3)數(shù)據(jù)庫層優(yōu)化:
- 數(shù)據(jù)庫層其實(shí)是最脆弱的一層,一般在應(yīng)用設(shè)計(jì)時(shí)在上游就需要把請(qǐng)求攔截掉,數(shù)據(jù)庫層只承擔(dān)“能力范圍內(nèi)”的訪問請(qǐng)求,所以,我們通過在服務(wù)層引入隊(duì)列和緩存,讓底層的數(shù)據(jù)庫高枕無憂。但是如果請(qǐng)求激增,還是有大量的查詢壓力到MySQL,這個(gè)時(shí)候就要想辦法解決MySQL的瓶頸了,這時(shí)候可用使用索引、緩存、SQL性能優(yōu)化等手段,還可以使用NoSQL數(shù)據(jù)庫來優(yōu)化數(shù)據(jù)模型、存儲(chǔ)結(jié)構(gòu)等。詳細(xì)內(nèi)容可關(guān)注后查看我的【mysql優(yōu)化專題】,共12篇,已完結(jié)。
(4)衡量網(wǎng)站性能的指標(biāo)(重要的有響應(yīng)時(shí)間、TPS、系統(tǒng)性能計(jì)數(shù)器等,通過這些指標(biāo)以確定系統(tǒng)設(shè)計(jì)是否達(dá)到目標(biāo))
- 響應(yīng)時(shí)間。
- 并發(fā)數(shù)。如果暫時(shí)沒有對(duì)應(yīng)的準(zhǔn)確監(jiān)控,針對(duì)不同業(yè)務(wù)模型,可以有不一樣的并發(fā)數(shù)的預(yù)估。我們的系統(tǒng)進(jìn)行峰值并發(fā)數(shù)預(yù)估的話,有一種比較粗略的計(jì)算方式,即全天請(qǐng)求平均每秒并發(fā)數(shù) * 3。但也需要case by case。
- 吞吐量。比較常見的有QPS(每秒查詢數(shù))、HPS(每秒http請(qǐng)求數(shù))以及TPS(每秒處理事務(wù)數(shù))。
- 性能計(jì)數(shù)器。包括系統(tǒng)負(fù)載、線程數(shù)、cpu、內(nèi)存使用情況等??梢杂胻op、free、cat /proc/cpuinfo等命令來查看。系統(tǒng)負(fù)載的定義為當(dāng)前被CPU執(zhí)行的線程數(shù)/等待被CPU執(zhí)行的總線程數(shù)。當(dāng)其值與邏輯cpu個(gè)數(shù)相同時(shí)是良好狀態(tài),其代表所有的資源都被大限度地被利用。但也有人認(rèn)為當(dāng)負(fù)載為0.7倍邏輯CPU數(shù)時(shí)較好。
(5)高可用:包括高可用的應(yīng)用、高可用的服務(wù)、高可用的數(shù)據(jù)和服務(wù)于高可用的監(jiān)控等,關(guān)于高可用,我還是決定開個(gè)單章講解
二、安全性
互聯(lián)網(wǎng)是開放的,任何人在任何地方都可以訪問網(wǎng)站。網(wǎng)站的安全架構(gòu)就是保護(hù)網(wǎng)站不受惡意訪問和攻擊,保護(hù)網(wǎng)站的重要數(shù)據(jù)不被竊取。
安全的5個(gè)要素:機(jī)密性、完整性、可用性、可控性和可審查性。
1、安全系統(tǒng)架構(gòu)
1)安全服務(wù)是指計(jì)算機(jī)網(wǎng)絡(luò)提供的安全防護(hù)措施,包括認(rèn)證服務(wù)、訪問控制、數(shù)據(jù)機(jī)密服務(wù)、數(shù)據(jù)完整服務(wù)和不可否認(rèn)服務(wù)。
2)特定的安全機(jī)制是用來實(shí)施安全服務(wù)的機(jī)制,包括加密機(jī)制、數(shù)據(jù)簽名機(jī)制、訪問控制機(jī)制、數(shù)據(jù)完整性機(jī)制、認(rèn)證交換機(jī)制、流量填充機(jī)制、路由控制機(jī)制和公證機(jī)制。
3)普遍性的安全機(jī)制不是為任何特定的服務(wù)而特設(shè)的,屬于安全管理方面,分為可信功能度、安全標(biāo)記、事件檢測(cè)、安全審計(jì)跟蹤和安全恢復(fù)。
2、安全保護(hù)等級(jí)
1)用戶自主保護(hù)級(jí)
2)系統(tǒng)審計(jì)保護(hù)級(jí)
3)安全標(biāo)記保護(hù)級(jí)
4)結(jié)構(gòu)化保護(hù)級(jí)
5)訪問驗(yàn)證保護(hù)級(jí)
衡量網(wǎng)站安全架構(gòu)的標(biāo)準(zhǔn)就是針對(duì)現(xiàn)存和潛在的各種攻擊和竊密手段,
是否有可靠的應(yīng)對(duì)策略。
三、可用性
衡量一個(gè)系統(tǒng)架構(gòu)設(shè)計(jì)是否滿足高可用的目標(biāo),就是假設(shè)系統(tǒng)中任何一臺(tái)或者多臺(tái)服務(wù)器宕機(jī)時(shí),以及出現(xiàn)各種不可預(yù)期的問題時(shí),系統(tǒng)整體是否依然可用。
一般就三個(gè)手段、冗余、集群化、分布式。
網(wǎng)站高可用的主要手段就是冗余,應(yīng)用部署在多臺(tái)服務(wù)器上同時(shí)提供服務(wù),數(shù)據(jù)存儲(chǔ)在多臺(tái)服務(wù)器上相互備份,任何一臺(tái)服務(wù)器都不會(huì)影響應(yīng)用的整體可以,通常的實(shí)現(xiàn)手段即把多臺(tái)服務(wù)器通過負(fù)載均衡設(shè)備組成一個(gè)集群。
四、擴(kuò)展性
擴(kuò)展性(Extensibility)指對(duì)現(xiàn)有系統(tǒng)影響最小的情況下,系統(tǒng)功能可持續(xù)擴(kuò)展或提升的能力。表現(xiàn)在系統(tǒng)基礎(chǔ)設(shè)施穩(wěn)定不需要經(jīng)常變更,應(yīng)用之間較少依賴和耦合,當(dāng)系統(tǒng)增加新功能時(shí),不需要對(duì)現(xiàn)有系統(tǒng)的結(jié)構(gòu)和代碼進(jìn)行修改。這個(gè)沒啥好說。擴(kuò)展性依賴于前期良好的架構(gòu)設(shè)計(jì)。合理業(yè)務(wù)邏輯抽象,水平/垂直切割分布式化等等。
網(wǎng)站可擴(kuò)展架構(gòu)的主要手段是事件驅(qū)動(dòng)架構(gòu)和分布式服務(wù)。
事件驅(qū)動(dòng)通常利用消息隊(duì)列實(shí)現(xiàn),通過這種方式將消息生產(chǎn)和處理邏輯分隔開。
服務(wù)器服務(wù)則是將業(yè)務(wù)和可復(fù)用服務(wù)分離開來,通過分布式服務(wù)框架調(diào)用。新增加產(chǎn)品可用通過調(diào)用可復(fù)用的服務(wù)來實(shí)現(xiàn)自身的業(yè)務(wù)邏輯,而對(duì)現(xiàn)有產(chǎn)品沒有任何影響。
對(duì)此,《可擴(kuò)展的藝術(shù)》一書提出了一個(gè)更加系統(tǒng)的可擴(kuò)展模型—— AKF可擴(kuò)展立方 (Scalability Cube)。這個(gè)立方體中沿著三個(gè)坐標(biāo)軸設(shè)置分別為:X、Y、Z。
- X軸擴(kuò)展 —— 關(guān)注水平的數(shù)據(jù)和服務(wù)克隆,也就是前文提到的“加機(jī)器解決問題”
- Y軸擴(kuò)展 —— 關(guān)注應(yīng)用中職責(zé)的劃分,比如數(shù)據(jù)類型,交易執(zhí)行類型的劃分
- Z軸擴(kuò)展 —— 關(guān)注服務(wù)和數(shù)據(jù)的優(yōu)先級(jí)劃分,如分地域劃分
整個(gè)擴(kuò)展模型,用下圖來表示,其中原點(diǎn)代表完全無擴(kuò)展的狀態(tài)。
五、伸縮性
服務(wù)盡量同構(gòu)。DB、cache在考慮分布式時(shí)盡量提前設(shè)計(jì)好擴(kuò)展方案。也可以采用一些主流的對(duì)水平伸縮支持較好的nosql、memcached、hbase等。
(1)橫向分離:將不同的業(yè)務(wù)模塊分離部署,實(shí)現(xiàn)系統(tǒng)的伸縮性;
(2)縱向分離:將業(yè)務(wù)處理流程上得不同部分分離部署,實(shí)現(xiàn)系統(tǒng)的伸縮性;