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

