結(jié)合我的個(gè)人經(jīng)驗(yàn)捌袜,針對(duì)高性能、高可用炸枣、高擴(kuò)展3個(gè)方面虏等,總結(jié)下可落地的實(shí)踐方案。
? 高性能的實(shí)踐方案
1适肠、集群部署霍衫,通過負(fù)載均衡減輕單機(jī)壓力。
2侯养、多級(jí)緩存敦跌,包括靜態(tài)數(shù)據(jù)使用CDN、本地緩存逛揩、分布式緩存等柠傍,以及對(duì)緩存場(chǎng)景中的熱點(diǎn)key、緩存穿透辩稽、緩存并發(fā)惧笛、數(shù)據(jù)一致性等問題的處理。
3搂誉、分庫(kù)分表和索引優(yōu)化徐紧,以及借助搜索引擎解決復(fù)雜查詢問題。
4炭懊、考慮NoSQL數(shù)據(jù)庫(kù)的使用并级,比如HBase、TiDB等侮腹,但是團(tuán)隊(duì)必須熟悉這些組件嘲碧,且有較強(qiáng)的運(yùn)維能力。
5父阻、異步化愈涩,將次要流程通過多線程、MQ加矛、甚至延時(shí)任務(wù)進(jìn)行異步處理履婉。
6、限流斟览,需要先考慮業(yè)務(wù)是否允許限流(比如秒殺場(chǎng)景是允許的)毁腿,包括前端限流、Nginx接入層的限流、服務(wù)端的限流已烤。
7鸠窗、對(duì)流量進(jìn)行削峰填谷,通過MQ承接流量胯究。
8稍计、并發(fā)處理,通過多線程將串行邏輯并行化裕循。
9臣嚣、預(yù)計(jì)算,比如搶紅包場(chǎng)景费韭,可以提前計(jì)算好紅包金額緩存起來(lái)茧球,發(fā)紅包時(shí)直接使用即可。
10星持、緩存預(yù)熱抢埋,通過異步任務(wù)提前預(yù)熱數(shù)據(jù)到本地緩存或者分布式緩存中。
11督暂、減少IO次數(shù)揪垄,比如數(shù)據(jù)庫(kù)和緩存的批量讀寫、RPC的批量接口支持逻翁、或者通過冗余數(shù)據(jù)的方式干掉RPC調(diào)用饥努。
12、減少IO時(shí)的數(shù)據(jù)包大小八回,包括采用輕量級(jí)的通信協(xié)議酷愧、合適的數(shù)據(jù)結(jié)構(gòu)、去掉接口中的多余字段缠诅、減少緩存key的大小溶浴、壓縮緩存value等。
13管引、程序邏輯優(yōu)化士败,比如將大概率阻斷執(zhí)行流程的判斷邏輯前置、For循環(huán)的計(jì)算邏輯優(yōu)化褥伴,或者采用更高效的算法谅将。
14、各種池化技術(shù)的使用和池大小的設(shè)置重慢,包括HTTP請(qǐng)求池饥臂、線程池(考慮CPU密集型還是IO密集型設(shè)置核心參數(shù))、數(shù)據(jù)庫(kù)和Redis連接池等似踱。
15隅熙、JVM優(yōu)化志衣,包括新生代和老年代的大小、GC算法的選擇等猛们,盡可能減少GC頻率和耗時(shí)。
16狞洋、鎖選擇弯淘,讀多寫少的場(chǎng)景用樂觀鎖,或者考慮通過分段鎖的方式減少鎖沖突吉懊。
上述方案無(wú)外乎從計(jì)算和 IO 兩個(gè)維度考慮所有可能的優(yōu)化點(diǎn)庐橙,需要有配套的監(jiān)控系統(tǒng)實(shí)時(shí)了解當(dāng)前的性能表現(xiàn),并支撐你進(jìn)行性能瓶頸分析借嗽,然后再遵循二八原則态鳖,抓主要矛盾進(jìn)行優(yōu)化。
? 高可用的實(shí)踐方案
1恶导、對(duì)等節(jié)點(diǎn)的故障轉(zhuǎn)移浆竭,Nginx和服務(wù)治理框架均支持一個(gè)節(jié)點(diǎn)失敗后訪問另一個(gè)節(jié)點(diǎn)。
2惨寿、非對(duì)等節(jié)點(diǎn)的故障轉(zhuǎn)移邦泄,通過心跳檢測(cè)并實(shí)施主備切換(比如redis的哨兵模式或者集群模式、MySQL的主從切換等)裂垦。
3顺囊、接口層面的超時(shí)設(shè)置、重試策略和冪等設(shè)計(jì)蕉拢。
4特碳、降級(jí)處理:保證核心服務(wù),犧牲非核心服務(wù)晕换,必要時(shí)進(jìn)行熔斷午乓;或者核心鏈路出問題時(shí),有備選鏈路届巩。
5硅瞧、限流處理:對(duì)超過系統(tǒng)處理能力的請(qǐng)求直接拒絕或者返回錯(cuò)誤碼。
6恕汇、MQ場(chǎng)景的消息可靠性保證腕唧,包括producer端的重試機(jī)制、broker側(cè)的持久化瘾英、consumer端的ack機(jī)制等枣接。
7、灰度發(fā)布缺谴,能支持按機(jī)器維度進(jìn)行小流量部署但惶,觀察系統(tǒng)日志和業(yè)務(wù)指標(biāo),等運(yùn)行平穩(wěn)后再推全量。
8膀曾、監(jiān)控報(bào)警:全方位的監(jiān)控體系县爬,包括最基礎(chǔ)的CPU、內(nèi)存添谊、磁盤财喳、網(wǎng)絡(luò)的監(jiān)控,以及Web服務(wù)器斩狱、JVM耳高、數(shù)據(jù)庫(kù)、各類中間件的監(jiān)控和業(yè)務(wù)指標(biāo)的監(jiān)控所踊。
9泌枪、災(zāi)備演練:類似當(dāng)前的“混沌工程”,對(duì)系統(tǒng)進(jìn)行一些破壞性手段秕岛,觀察局部故障是否會(huì)引起可用性問題碌燕。
高可用的方案主要從冗余、取舍瓣蛀、系統(tǒng)運(yùn)維3個(gè)方向考慮陆蟆,同時(shí)需要有配套的值班機(jī)制和故障處理流程,當(dāng)出現(xiàn)線上問題時(shí)惋增,可及時(shí)跟進(jìn)處理叠殷。
? 高擴(kuò)展的實(shí)踐方案
1、合理的分層架構(gòu):比如上面談到的互聯(lián)網(wǎng)最常見的分層架構(gòu)诈皿,另外還能進(jìn)一步按照數(shù)據(jù)訪問層林束、業(yè)務(wù)邏輯層對(duì)微服務(wù)做更細(xì)粒度的分層(但是需要評(píng)估性能,會(huì)存在網(wǎng)絡(luò)多一跳的情況)稽亏。
2壶冒、存儲(chǔ)層的拆分:按照業(yè)務(wù)維度做垂直拆分、按照數(shù)據(jù)特征維度進(jìn)一步做水平拆分(分庫(kù)分表)截歉。
3胖腾、業(yè)務(wù)層的拆分:最常見的是按照業(yè)務(wù)維度拆(比如電商場(chǎng)景的商品服務(wù)、訂單服務(wù)等)瘪松,也可以按照核心接口和非核心接口拆咸作,還可以按照請(qǐng)求源拆(比如To C和To B,APP和H5)宵睦。