深入理解微服務(wù)中的高并發(fā)、高性能、高可用及處理方式
前言
首先要明確的一個(gè)概念是: 高并發(fā)是根因,而高性能和高可用是結(jié)果。
通俗點(diǎn)來(lái)說(shuō),就是指為了解決高并發(fā)這一現(xiàn)象,怎么做,才能保證系統(tǒng)的高性能和高可用?
系統(tǒng)在巨大的流量洪峰(即指高并發(fā)場(chǎng)景)沖擊下,依然能高效、穩(wěn)定、正常地(即指高性能、高可用)對(duì)外提供服務(wù),這是系統(tǒng)設(shè)計(jì)的主要目標(biāo)之一。
具體的指標(biāo)定義,如:高并發(fā)方面要求 QPS(Queries Per Second,每秒查詢率) 大于 10 萬(wàn),高性能方面要求請(qǐng)求延遲小于 100 ms,高可用方面要高于 99.99%。
1. 高并發(fā)
高并發(fā)問(wèn)題:如果百萬(wàn)級(jí)別、千萬(wàn)級(jí)別甚至上億級(jí)別的訪問(wèn)請(qǐng)求同時(shí)到來(lái),系統(tǒng)怎么快速處理這些請(qǐng)求且能保證系統(tǒng)不崩潰?
基于上面的問(wèn)題,從請(qǐng)求入口開始分析處理一個(gè)請(qǐng)求要用到哪些策略或者技術(shù)、方式。
1.1 負(fù)載均衡
當(dāng)請(qǐng)求到來(lái)時(shí),給到哪個(gè)服務(wù)去處理?這里涉及到請(qǐng)求的分發(fā)問(wèn)題,采用負(fù)載均衡的方式處理,那么其對(duì)應(yīng)的應(yīng)用部署方式就得是集群化部署了。
1.2 池化技術(shù)
處理請(qǐng)求,由于請(qǐng)求多,做阻塞式處理肯定不行,因此采用多線程處理。
而多線程處理時(shí)如果涉及順序問(wèn)題或者一致性問(wèn)題,要考慮對(duì)資源加鎖處理。
線程的創(chuàng)建,需要消耗時(shí)間、消耗內(nèi)存、消耗 CPU ,總結(jié)就是有開銷,特別是大量創(chuàng)建線程時(shí),開銷更大;因此為了解決這個(gè)問(wèn)題,用到池化技術(shù)。
池化技術(shù)包括:線程池、連接池、內(nèi)存池、對(duì)象池、協(xié)程池、進(jìn)程池等
1.3 流量過(guò)濾
做好前置校驗(yàn),對(duì)于非法的、不符合要求的請(qǐng)求,設(shè)計(jì)好過(guò)濾器進(jìn)行過(guò)濾,在進(jìn)行真正的業(yè)務(wù)邏輯處理之前,先對(duì)流量過(guò)濾一輪,減少并發(fā)壓力。
過(guò)濾器:設(shè)計(jì)一套自己的規(guī)則,對(duì)過(guò)來(lái)的請(qǐng)求進(jìn)行校驗(yàn)(如校驗(yàn)IP、校驗(yàn)請(qǐng)求參數(shù)是否合法等),如果不符合要求,直接拒絕,不進(jìn)行后面的處理。
2. 高性能
系統(tǒng)性能不好,直接導(dǎo)致的問(wèn)題就是處理請(qǐng)求耗時(shí)長(zhǎng),用戶等待時(shí)間長(zhǎng),用戶體驗(yàn)差。
系統(tǒng)性能影響的因素:
- 用戶網(wǎng)絡(luò)環(huán)境
- 請(qǐng)求/響應(yīng)的數(shù)據(jù)包大小
- 業(yè)務(wù)系統(tǒng) CPU、內(nèi)存、磁盤等性能
- 業(yè)務(wù)鏈路的長(zhǎng)度
- 關(guān)系方系統(tǒng)的性能
- 處理邏輯的代碼實(shí)現(xiàn)是否高效… 等等
怎么提高系統(tǒng)的性能?
2.1 使用緩存
高并發(fā)場(chǎng)景下,對(duì)于查詢操作,每次都去查數(shù)據(jù)庫(kù),會(huì)給數(shù)據(jù)庫(kù)造成很大壓力,導(dǎo)致性能下降,嚴(yán)重的直接就宕機(jī)了,所以這是要避免的,需要引入緩存,比如用 Redis 、MemCache去做緩存處理。
查詢的時(shí)候,先去緩存中讀,如果有結(jié)果就直接返回,沒有再去數(shù)據(jù)庫(kù)查,減少直接訪問(wèn)數(shù)據(jù)庫(kù)的次數(shù),并且讀緩存的效率是比讀數(shù)據(jù)庫(kù)要高的。
2.2 磁盤問(wèn)題處理
實(shí)際開發(fā)中,我們經(jīng)常會(huì)在一些關(guān)鍵的地方,寫上日志的打印語(yǔ)句,方便定位并排查問(wèn)題。
不打日志的人,不是好人,絕非善類,十有八九是個(gè)坑爹的貨,機(jī)智的你要知道速速遠(yuǎn)離。
我們打印出來(lái)的日志,最終還是會(huì)寫到磁盤上保存起來(lái),這里就涉及到了磁盤的 IO 讀寫問(wèn)題。
不僅僅是寫日志,包括其它涉及直接讀或者寫磁盤上文件的操作,都會(huì)有相同的問(wèn)題。
磁盤讀寫的效率肯定是低于 CPU 或者 內(nèi)存的處理效率的,而且磁盤本身也是有性能的問(wèn)題存在。
所以可以這么處理:
- 磁盤升級(jí),選用讀寫性能更好的磁盤,這里是硬件層次的處理
- 在寫文件到磁盤上時(shí),可以考慮先寫到內(nèi)存上,給內(nèi)存設(shè)定一個(gè)閾值,當(dāng)達(dá)到閾值時(shí)再批量將內(nèi)存上的文件,寫到磁盤上
3. 高可用
系統(tǒng)的高可用,更多的是從架構(gòu)和部署方式去著手解決。
例如一個(gè)單體系統(tǒng),所有業(yè)務(wù)模塊都放到同一個(gè)系統(tǒng)中,當(dāng)某一個(gè)模塊壞掉,會(huì)導(dǎo)致整個(gè)系統(tǒng)壞掉,無(wú)法對(duì)外提供正常的服務(wù),這就是不可用。
如果是微服務(wù)系統(tǒng),每個(gè)模塊都是獨(dú)立的小系統(tǒng),所有小系統(tǒng)共同組成一個(gè)微服務(wù)系統(tǒng)對(duì)外提供服務(wù),一個(gè)小系統(tǒng)壞掉,并不會(huì)影響到其它小系統(tǒng)正常運(yùn)行,而整體依舊可以對(duì)外提供服務(wù),可用性比單體的更高。
保證系統(tǒng)可用性的策略或者方式,大致有下面這么些:
3.1 采用微服務(wù)架構(gòu)
利用微服務(wù)架構(gòu),分散能力,使得各個(gè)模塊獨(dú)立成為一個(gè)小系統(tǒng),降低系統(tǒng)間的耦合性,提高系統(tǒng)對(duì)外提供正常服務(wù)的能力。
3.2 采用分布式+集群部署
在高并發(fā)場(chǎng)景下,一個(gè)服務(wù)的部署,不應(yīng)該只部署在一臺(tái)服務(wù)器上,起碼 3 臺(tái)以上,這樣,一臺(tái)服務(wù)器宕機(jī)了,還有另外的服務(wù)器能正常使用并對(duì)外服務(wù),這樣就用到了集群的部署方式。
而采用微服務(wù)架構(gòu),也不應(yīng)該把每個(gè)獨(dú)立的小系統(tǒng)都部署在同一臺(tái)服務(wù)器上,一個(gè)小系統(tǒng)就是一臺(tái)服務(wù)器,這就使用了分布式部署。
將上面的兩種部署方式結(jié)合起來(lái)用,先做分布式部署再為每個(gè)小系統(tǒng)拓展成為一個(gè)集群,就產(chǎn)生了分布式+集群部署。
3.3 同城雙活、異地多活
這里是做災(zāi)備考慮,例如當(dāng)前放置服務(wù)器的機(jī)房,由于溫度過(guò)高,著火了,所有服務(wù)器都被燒掉,面對(duì)這樣的情況,前面的架構(gòu)設(shè)計(jì)得再好也無(wú)濟(jì)于事。
基于上面可能存在的情況,就要考慮做同城雙活或者異地多活了。
簡(jiǎn)單來(lái)說(shuō),就是多建幾個(gè)同樣的機(jī)房,并且這些機(jī)房分布在不同的地理位置,這樣一個(gè)機(jī)房被燒掉了,另外的還能用,依舊保證了可用性。
3.4 主從切換
對(duì)于需要存儲(chǔ)數(shù)據(jù)的應(yīng)用,例如 Redis 、Mysql 等,做好主從復(fù)制,做好一主多從的設(shè)計(jì)和考慮,當(dāng)主節(jié)點(diǎn)出問(wèn)題時(shí),從節(jié)點(diǎn)自動(dòng)升級(jí)為新的主節(jié)點(diǎn),對(duì)外服務(wù)。
3.5 熔斷限流
熔斷與限流,二者的目的都是提供過(guò)載保護(hù),保證系統(tǒng)不至于崩潰,無(wú)法使用。
這里的過(guò)載保護(hù),是指負(fù)載超過(guò)系統(tǒng)的承載能力時(shí),系統(tǒng)需要自動(dòng)采取保護(hù)措施,確保自身不被壓垮、崩潰。
熔斷:在系統(tǒng)瀕臨崩潰時(shí),立即中斷服務(wù),停止所有請(qǐng)求的處理,保障系統(tǒng)穩(wěn)定避免崩潰。類似于電器中的“保險(xiǎn)絲”,當(dāng)電流過(guò)大的時(shí)候,“保險(xiǎn)絲”會(huì)先被燒掉,斷開電流,以免電路過(guò)熱燒毀電器引起火災(zāi)。
限流:原理跟熔斷有點(diǎn)類似,都是通過(guò)判斷某個(gè)條件來(lái)確定是否執(zhí)行某個(gè)策略。
熔斷與限流的區(qū)別:熔斷,觸發(fā)過(guò)載保護(hù),該節(jié)點(diǎn)會(huì)暫停服務(wù),直到恢復(fù);限流,只處理自己能力范圍之內(nèi)的請(qǐng)求,超出范圍的請(qǐng)求會(huì)被限流,并不會(huì)暫停服務(wù)。
到此這篇關(guān)于深入理解Java中的高并發(fā)、高性能、高可用及處理方式的文章就介紹到這了,更多相關(guān)Java高并發(fā)、高性能、高可用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過(guò)IBM 3650 M2服務(wù)器的ServerGuide工具配置RAID圖文教程
這篇文章主要介紹了通過(guò)IBM 3650 M2服務(wù)器的ServerGuide工具配置RAID圖文教程,需要的朋友可以參考下2018-05-05VSCODE使用ssh遠(yuǎn)程連接時(shí)啟動(dòng)服務(wù)器失敗問(wèn)題及解決方法
ping服務(wù)器的ip可通并且使用terminal可以ssh連接到遠(yuǎn)程服務(wù)器,但使用vscode的remote-ssh時(shí),在「輸出」欄出現(xiàn)了一直報(bào) Waiting for server log… 的情況,這篇文章主要介紹了VSCODE使用ssh遠(yuǎn)程連接時(shí)啟動(dòng)服務(wù)器失敗問(wèn)題及解決方法,感興趣的朋友一起看看吧2024-02-02jenkins插件pipeline集成持續(xù)交付管道全面介紹
這篇文章主要就jenkins插件pipeline集成持續(xù)交付管道相關(guān)內(nèi)容做一個(gè)全面介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03Win2003下cwRsyncServer服務(wù)端與cwRsync客戶端數(shù)據(jù)同步實(shí)例教程
這篇文章主要介紹了Win2003下cwRsyncServer服務(wù)端與cwRsync客戶端數(shù)據(jù)同步實(shí)例教程,需要的朋友可以參考下2015-07-07centOs6.9服務(wù)器版本安裝圖解(包含java和mysql)
這篇文章主要介紹了centOs6.9服務(wù)器版本安裝圖解(包含java和mysql),需要的朋友可以參考下2017-06-06