先簡略回顧一下抗愁。對于互聯(lián)網(wǎng)產(chǎn)品的高性能架構(gòu)設(shè)計通常包括以下幾個大方面:
- Web瀏覽器高性能設(shè)計
- App客戶端高性能設(shè)計
- 高性能的網(wǎng)絡(luò)和硬件
- 后臺服務(wù)高性能設(shè)計
后端服務(wù)一般指用戶直接看到的遠程服務(wù)纽哥,涉及到網(wǎng)絡(luò)硬件铐尚、邏輯計算搞莺、通信協(xié)議和數(shù)據(jù)存儲等部分主穗。下面我們將著重介紹高性能后臺服務(wù)的設(shè)計方法和策略温算。
一扣草、高性能的網(wǎng)絡(luò)和硬件
- 網(wǎng)絡(luò)硬件是提供實現(xiàn)高性能服務(wù)的先決條件,如果網(wǎng)絡(luò)硬件失敗氨鹏,再優(yōu)秀的團隊也是“巧婦難為無米之炊”欧募。互聯(lián)網(wǎng)產(chǎn)品在網(wǎng)絡(luò)硬件方面經(jīng)常需要使用的高性能方案有如下幾種:
- CDN加速技術(shù)仆抵。CDN加速將網(wǎng)站的內(nèi)容緩存在網(wǎng)絡(luò)邊緣(離用戶接入網(wǎng)絡(luò)最近的地方)跟继,然后在用戶訪問網(wǎng)站內(nèi)容的時候,通過調(diào)度系統(tǒng)將用戶的請求路由或者引導(dǎo)到離用戶接入網(wǎng)絡(luò)最近或者訪問效果最佳的緩存服務(wù)器上镣丑,由該緩存服務(wù)器為用戶提供內(nèi)容服務(wù)舔糖;相對于直接訪問源站,這種方式縮短了用戶和內(nèi)容之間的網(wǎng)絡(luò)距離莺匠,從而達到加速的效果金吗。
- 足夠的帶寬。帶寬應(yīng)該滿足在網(wǎng)站峰值的情況還能足夠快速的使用趣竣,所以網(wǎng)絡(luò)帶寬應(yīng)該大于峰值流量 = 峰值QPS * 平均請求大小摇庙。只有在保證帶寬的情況才能實現(xiàn)高性能服務(wù)。
- 服務(wù)器性能遥缕。服務(wù)器性能主要從CPU卫袒、內(nèi)存和磁盤三個方面來考慮,CPU核心數(shù)量能盡量多點通砍,內(nèi)存大小最好大一點玛臂,利用到磁盤存儲的話SSD會優(yōu)于機械磁盤。
- 硬件負載均衡設(shè)備封孙。對于有條件的團隊可以采購硬件負載均衡設(shè)備,加強后臺服務(wù)負載均衡的能力讽营,比如F5虎忌。
二、后臺服務(wù)高性能設(shè)計
后臺服務(wù)的高性能設(shè)計是互聯(lián)網(wǎng)產(chǎn)品高性能架構(gòu)設(shè)計中最重要的一環(huán)橱鹏,對服務(wù)整體性能起到?jīng)Q定性的作用膜蠢。我們來看看設(shè)計高性能后臺服務(wù)的方法:
1分布式緩存堪藐。
緩存的本質(zhì)是通過key-value形式的Hash表提升讀寫速度,一般情況是O(1)的讀寫速度挑围。讀寫量比較高礁竞,變化量不大的數(shù)據(jù)比較適合使用緩存。業(yè)內(nèi)比較成熟的分布式緩存系統(tǒng)有redis/memcache杉辙。在此我向大家推薦一個架構(gòu)學(xué)習(xí)交流圈模捂。交流學(xué)習(xí)企鵝圈號:948368769 里面會分享一些資深架構(gòu)師錄制的視頻錄像:有Spring,MyBatis蜘矢,Netty源碼分析狂男,高并發(fā)、高性能品腹、分布式岖食、微服務(wù)架構(gòu)的原理,JVM性能優(yōu)化舞吭、分布式架構(gòu)等這些成為架構(gòu)師必備的知識體系泡垃。還能領(lǐng)取免費的學(xué)習(xí)資源,目前受益良多
一般的緩存設(shè)計架構(gòu)如下:用戶第一次請求應(yīng)用程序時羡鸥,通過存儲服務(wù)直接讀取數(shù)據(jù)蔑穴,然后將數(shù)據(jù)存儲到緩存系統(tǒng)去,用戶第二次請求的時候就直接從緩存系統(tǒng)讀取兄春,從而提升讀取速度澎剥。
對于分布式緩存系統(tǒng)可以Set化部署,比如商品數(shù)據(jù)緩存到Set1赶舆,用戶數(shù)據(jù)緩存到Set2哑姚,或者一類用戶的數(shù)據(jù)緩存到Set1,另一類的用戶緩存到Set2芜茵,如下圖:
此外叙量,也可以按集群化部署,每一個緩存服務(wù)存儲的數(shù)據(jù)都是對等的九串,可以對外提供同等的服務(wù)绞佩,所以外部請求需要負載均衡到不同有緩存服務(wù)器,如下圖:
Set化部署的目的主要在于將不同類型的數(shù)據(jù)路由到不同的地方猪钮,好處就是可以減少不同業(yè)務(wù)數(shù)據(jù)的耦合品山,可以針對不同業(yè)務(wù)進行不同的優(yōu)化,從而提升整體性能烤低。集群式部署的目的在于肘交,提高緩存系統(tǒng)的對外服務(wù)能力,上層業(yè)務(wù)的路由策略簡單靈活扑馁,擴縮容比較容易涯呻。
2.服務(wù)分層
在經(jīng)典的三層(接入層凉驻、邏輯層和存儲層)后臺服務(wù)架構(gòu)中,三層的劃分的原則就是同層次的系統(tǒng)專注處理自己的事情复罐。接入層專注于處理前端和后臺服務(wù)的接入連通涝登、安全認證和數(shù)據(jù)轉(zhuǎn)發(fā)。邏輯層專注于處理不同業(yè)務(wù)的無狀態(tài)邏輯服務(wù)效诅。存儲層專注于處理業(yè)務(wù)數(shù)據(jù)的存儲胀滚。這樣分層的好處在于各個層次能夠依據(jù)業(yè)務(wù)特點專注于自己的事情,提高系統(tǒng)復(fù)用性填帽,降低業(yè)務(wù)間的耦合性蛛淋。在中小型網(wǎng)站中三層架構(gòu)的典型實現(xiàn)是Nginx(接入層)、Apache Web(邏輯層)篡腌、Mysql/Redis(存儲層)褐荷。
3.操作異步化
目前大型系統(tǒng)中普遍消息隊列來將調(diào)用異步化,不僅可以提升系統(tǒng)性能還可以提升系統(tǒng)的擴展性嘹悼。對于大量的數(shù)據(jù)庫寫請求叛甫,對于數(shù)據(jù)庫的壓力很大,同時也會造成數(shù)據(jù)庫響應(yīng)不及時杨伙∑浼啵可以考慮使用消息隊列,數(shù)據(jù)庫的寫請求可以直接寫入到消息隊列限匣,然后通過多線程或多進程從消息隊列中讀取數(shù)據(jù)慢慢寫入到數(shù)據(jù)庫抖苦。消息隊列服務(wù)器的處理速度會遠遠快于數(shù)據(jù)庫,所以用戶在寫入操作時會感覺到很快的寫入速度米死。
此外锌历,消息隊列對于請求不均衡的系統(tǒng),還具有削峰填谷的作用峦筒,將短時間內(nèi)的高峰請求究西,逐步平攤到更長的時間里去,從而避免短時間內(nèi)大量請求壓跨系統(tǒng)物喷。
4.服務(wù)拆分
服務(wù)拆分有多種說法卤材,比如大系統(tǒng)小做,分布式拆分峦失,分層結(jié)構(gòu)以及目前很流行的微服務(wù)化扇丛。不過服務(wù)拆分一般來說有以下原則:
- a.高內(nèi)聚、低耦合: 將耦合性低的業(yè)務(wù)邏輯劃分為不同系統(tǒng)尉辑,將聚合性高的業(yè)務(wù)邏輯劃分為同一個系統(tǒng)晕拆。
- b.單一職責(zé)原則:對于一個層次或者一個模塊應(yīng)該保持相對單一的職責(zé),專注于自己的服務(wù)材蹬。
- c.故障隔離:不同系統(tǒng)必須相對獨立設(shè)計和運行实幕,能夠獨立處理自己的故障,而不至于影響全局堤器。
- d.獨立運維和持續(xù)交互:對于不同的系統(tǒng)可以隨時迭代更新昆庇,而不至于影響其他服務(wù)。
對于服務(wù)拆分主要有縱向拆分和水平拆分兩種方法闸溃。三層架構(gòu)就是典型的縱向拆分模式整吆,第2)點有所闡述。對于不同的業(yè)務(wù)模塊辉川,針對業(yè)務(wù)邏輯和存儲服務(wù)可以按水平拆分的方法將拆分為不同的系統(tǒng)表蝙。比如商品系統(tǒng)邏輯層、訂單系統(tǒng)邏輯層乓旗、商品系統(tǒng)存儲層府蛇、訂單系統(tǒng)存儲層。在此我向大家推薦一個架構(gòu)學(xué)習(xí)交流圈屿愚。交流學(xué)習(xí)企鵝圈號:948368769 里面會分享一些資深架構(gòu)師錄制的視頻錄像:有Spring汇跨,MyBatis,Netty源碼分析妆距,高并發(fā)穷遂、高性能、分布式娱据、微服務(wù)架構(gòu)的原理蚪黑,JVM性能優(yōu)化、分布式架構(gòu)等這些成為架構(gòu)師必備的知識體系中剩。還能領(lǐng)取免費的學(xué)習(xí)資源忌穿,目前受益良多
5分布式集群化
分布式集群化是指將不同的業(yè)務(wù)用集群化的方式部署到不同的機器上去,對于每一個業(yè)務(wù)都具備大規(guī)模集群化的能力咽安,從而提升系統(tǒng)的擴展性和高性能伴网。
對于無狀態(tài)化的被調(diào)服務(wù)A,在基于負載均衡的技術(shù)下妆棒,可以通過集群化部署成倍的提升服務(wù)性能澡腾,比如A1服務(wù)的性能是1萬請求每秒,那么部署3臺A服務(wù)機器糕珊,那么A服務(wù)的性能就是3萬請求每秒了动分。
6.代碼優(yōu)化
對于IO操作的請求可以采用基于狀態(tài)機的異步化編程。如下圖的請求需要業(yè)務(wù)系統(tǒng)調(diào)用三個接口才能返回響應(yīng)數(shù)據(jù)红选,當(dāng)業(yè)務(wù)系統(tǒng)收到請求時澜公,將給該請求分配一個seqid,該seqid在接口響應(yīng)中也應(yīng)該原封返回,然后并發(fā)三個IO接口的請求包坟乾,將該seqid對應(yīng)的請求上下文保存到timer中迹辐,然后去并發(fā)處理其他請求,從而極大的提升系統(tǒng)性能甚侣。
此外明吩,高性能的編程模型還有多線程模型、多進程模型殷费、多協(xié)程模型和事件驅(qū)動模型印荔。
對于數(shù)據(jù)結(jié)構(gòu)的設(shè)計可以采用高效的數(shù)據(jù)結(jié)構(gòu),比如典型的key-value緩存系統(tǒng)就是基于hash的基本原理來實現(xiàn)的详羡,hash表的查詢效率是O(1)仍律,效率極快。