微服務(wù)高可用、高并發(fā)思路

一、高可用

1. 負(fù)載均衡、反向代理:

? ? 作用:將全部的網(wǎng)絡(luò)請(qǐng)求均衡地分布到其它服務(wù)器,合理管理網(wǎng)絡(luò)流量。

? ? LVS:軟件負(fù)載均衡器;F5:硬件負(fù)載均衡器。

? ? Nginx:軟件負(fù)載均衡器、反向代理服務(wù)器。

圖1

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ù)。保證正常流量可用。

圖2.1

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)。

圖3.1

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)吞吐量。

? ?


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容