一、高可用
1. 負(fù)載均衡、反向代理:
? ? 作用:將全部的網(wǎng)絡(luò)請(qǐng)求均衡地分布到其它服務(wù)器,合理管理網(wǎng)絡(luò)流量。
? ? LVS:軟件負(fù)載均衡器;F5:硬件負(fù)載均衡器。
? ? Nginx:軟件負(fù)載均衡器、反向代理服務(wù)器。

2. 隔離:
? ? 作用:將系統(tǒng)或資源分割開,保障服務(wù)間的相互不影響和可用性。
? ? 隔離常用手段:
? ? 1.) 線程隔離:核心業(yè)務(wù)線程池、非核心業(yè)務(wù)線程池?;趕ervlet3的線程隔離術(shù),tomcat7之后版本引入了servlet3,它基于NIO能處理更大的并發(fā)數(shù)。
? ? ? ? * 通過異步化不會(huì)獲得更快的響應(yīng)時(shí)間,但提升了整體的吞吐量和更高的靈活性,根據(jù)業(yè)務(wù)重要性進(jìn)行分級(jí),對(duì)不同的線程池進(jìn)行監(jiān)控、運(yùn)維和降級(jí)等處理。
? ? 2.) 進(jìn)程隔離:拆分多個(gè)子系統(tǒng)來實(shí)現(xiàn)物理隔離。
? ? 3.) 集群隔離:部署多個(gè)服務(wù)集群(常規(guī)服務(wù)分組,秒殺服務(wù)分組)
? ? 3.) 機(jī)房隔離:多個(gè)機(jī)房部署,本機(jī)房服務(wù)正常只調(diào)用本機(jī)房服務(wù),當(dāng)其中一個(gè)機(jī)房發(fā)生問題是,通過負(fù)載均衡將請(qǐng)求全部切到另一個(gè)機(jī)房。
? ? 4.) 讀寫隔離:通過主從模式將讀和寫集群分離,如MySQL、Redis。
? ? 5.) 動(dòng)靜隔離:將動(dòng)態(tài)內(nèi)容和靜態(tài)資源分離,靜態(tài)資源放在CDN上。防止訪問量太大導(dǎo)致寬帶被打滿,從而出現(xiàn)不可用。
? ? 6.) 爬蟲隔離:過濾惡意IP,分流到固定分組服務(wù)。保證正常流量可用。

3. 限流:
? ? 作用:一個(gè)時(shí)間窗口內(nèi)的請(qǐng)求進(jìn)行限速來保護(hù)系統(tǒng),達(dá)到限制速率拒絕服務(wù),從而保護(hù)系統(tǒng)可用性。
? ? 限流算法:
? ? 1.) 令牌桶:存放固定容量令牌的桶,按照固定速率往桶里添加令牌。桶滿時(shí),新添加的令牌被丟棄或拒絕。允許一定程度突發(fā)流量。算法實(shí)現(xiàn)上,可用樂觀鎖CAS(Compare and Swap 比較并交換)實(shí)現(xiàn),AtomicInteger。
? ? 2.) 漏桶:固定容量的漏桶,按照固定速率流出水滴。平滑突發(fā)流入速率。算法實(shí)現(xiàn)上,可以使用一個(gè)BlockingQueue表示漏桶,請(qǐng)求進(jìn)來時(shí)放入這個(gè)BlockingQueue中。另起一個(gè)線程以固定的速率從BlockingQueue中取出請(qǐng)求,再提交給業(yè)務(wù)線程池處理。漏桶算法有個(gè)弊端:無法應(yīng)對(duì)短時(shí)間的突發(fā)流量 。
? ? 3.) 計(jì)數(shù)器:限制總并發(fā)數(shù),Redis+Lua實(shí)現(xiàn)。

4. 降級(jí):
? ? 作用:保證核心服務(wù)可用。
? ? 降級(jí)手段:自動(dòng)開關(guān)降級(jí)、人工開關(guān)降級(jí)、讀服務(wù)降級(jí)、寫服務(wù)降級(jí)等。
? ? 通過配置中心設(shè)置降級(jí)開關(guān);可使用Hystrix實(shí)現(xiàn)降級(jí)、熔斷。
5. 超時(shí)與重試機(jī)制:
? ? * 如果應(yīng)用不設(shè)置超時(shí),可能導(dǎo)致請(qǐng)求響應(yīng)慢,慢請(qǐng)求累積導(dǎo)致連鎖反應(yīng),甚至造成應(yīng)用雪崩。
? ? * 設(shè)置超時(shí)時(shí)間,重試次數(shù)(不超過3次)
? ? * Nginx、Tomcat、中間件客戶端、數(shù)據(jù)庫客戶端、NoSQL客戶端、業(yè)務(wù)超時(shí)、前端Ajax超時(shí)等
6. 回滾機(jī)制:
? ? 代碼庫回滾、數(shù)據(jù)版本回滾、靜態(tài)資源版本回滾等。
7. 壓測(cè)與預(yù)案:
? ? 系統(tǒng)壓測(cè)、應(yīng)急預(yù)案。
二、高并發(fā)
1. 緩存:
? ? 應(yīng)用及緩存:堆內(nèi)緩存、堆外緩存、分布式緩存。
? ? HTTP緩存:根據(jù)服務(wù)器端返回的緩存設(shè)置響應(yīng)頭將響應(yīng)內(nèi)容緩存到瀏覽器。減少瀏覽器端和服務(wù)器端之間來回傳輸數(shù)據(jù)量,節(jié)省帶寬。
? ? 多級(jí)緩存:整個(gè)系統(tǒng)架構(gòu)的不同系統(tǒng)層級(jí)進(jìn)行數(shù)據(jù)緩存,以提升訪問效率。Nginx本地緩存、分布式緩存、Tomcat堆緩存。
? ? * 可擴(kuò)展分布式緩存常用一致性哈希算法。
? ? * 考慮更新緩存與原子性,緩存擊穿、緩存雪崩問題。
2. 連接池、線程池:
? ? 連接池:如數(shù)據(jù)庫連接池、Redis連接池、HTTP連接池,通過復(fù)用TCP連接減少創(chuàng)建和釋放連接的時(shí)間來提升性能。
? ? 線程池:線程池也是類似,通過復(fù)用線程提升性能。ThreadPoolExecutor,根據(jù)任務(wù)類型是IO密集型還是CPU密集型、CPU核數(shù),設(shè)置合理的線程池大小、隊(duì)列大小、拒絕策略。
3. 異步并發(fā):
? ? 防止請(qǐng)求阻塞方案:異步、協(xié)程;Java不支持協(xié)程,則使用異步提升吞吐量。
? ? 異步Future
? ? 異步Callback
? ? 異步CompletableFuture
4. 擴(kuò)容:
? ? 水平拆分和垂直拆分?jǐn)?shù)據(jù)/應(yīng)用來提升系統(tǒng)負(fù)載能力。理想情況,只需要增加機(jī)器就可以解決系統(tǒng)瓶頸。糟糕情況,需從架構(gòu)層面重構(gòu)甚至是重新設(shè)計(jì)。
? ? 單體應(yīng)用垂直擴(kuò)容
? ? 單體應(yīng)用水平擴(kuò)容
? ? 應(yīng)用拆分
? ? 數(shù)據(jù)庫拆分(分庫分表)
5. 隊(duì)列:
? ? 作用:系統(tǒng)解耦、流量削峰、數(shù)據(jù)同步、擴(kuò)展性、異步處理、緩沖等。
? ? * 保證最終一致性、不需要強(qiáng)一致性。(保證最終一致性的手段)
? ? * 考慮消息的重復(fù)處理,有序性問題。
三、總結(jié):
? ? * 通過負(fù)載均衡和反向代理實(shí)現(xiàn)分流,通過限流保護(hù)服務(wù)免受雪崩之災(zāi),通過降級(jí)實(shí)現(xiàn)部分可用、有損服務(wù),通過隔離實(shí)現(xiàn)故障隔離,通過設(shè)置合理的超時(shí)與重試機(jī)制避免請(qǐng)求堆積造成雪崩,通過回滾機(jī)制快速修改錯(cuò)誤版本;通過上述原則來保護(hù)系統(tǒng),使得系統(tǒng)高可用。
? ? * 通過緩存、異步并發(fā)、連接池、線程池、擴(kuò)容、消息隊(duì)列、分布式任務(wù)等高并發(fā)原則來提升系統(tǒng)吞吐量。
? ?