目錄
❇ 高效能的實務方案" >❇ 高效能的實務方案
❇ 高可用的實踐方案" >❇ 高可用的實踐方案
❇ 高擴展的實踐方案" >❇ 高擴展的實踐方案
首頁 Java Java面試題 面試官:你對高並發了解多少?我:emmm...

面試官:你對高並發了解多少?我:emmm...

Jul 26, 2023 pm 04:07 PM
面試題

面試官:你對高並發了解多少?我:emmm...

#高並發,幾乎是每個程式設計師都想擁有的經驗。 原因很簡單:隨著流量變大,會遇到各種各樣的技術問題,例如介面響應逾時、CPU load升高、GC頻繁、死鎖、大數據量存儲等等,這些問題能推動我們在技術深度上不斷精進。

在過往的面試中,如果候選人做過高並發的項目,我通常會讓對方談談對於高並發的理解,但是能係統性地回答好此問題的人並不多,大概分成這樣幾類:

1、##對資料化的指標沒有概念:不清楚選擇什麼樣的指標來衡量高並發系統?分不清並發量和QPS,甚至不知道自己系統的總用戶量、活躍用戶量,平峰和高峰時的QPS和TPS等關鍵數據。

2、設計了一些方案,但細節掌握不透徹:##講不出該方案要關注的技術點和可能帶來的副作用。例如讀取效能有瓶頸會引入緩存,但是忽略了快取命中率、熱點key、資料一致性等問題。

3、理解片面,把高並發設計等同於效能優化:大談並發程式設計、多層快取、非同步化、水平擴容,卻忽略高可用設計、服務治理及維運保障。

4、掌握大方案,卻忽略最基本的東西:能講清楚垂直分層、水平分區、快取等大思路,卻沒意識去分析資料結構是否合理,演算法是否高效,沒想過從最根本的IO和計算兩個維度去做細節優化。

這篇文章,我想結合自己的高並發專案經驗,系統性地總結下高並發需要掌握的知識和實踐思路,希望對你有所幫助。 內容分成以下3個部分:

  • 如何理解高並發?
  • 高並發系統設計的目標是什麼?
  • 高並發的實踐方案有哪些?

01 如何理解高並發?

高並發意味著大流量,需要運用技術手段抵抗流量的衝擊,這些手段好比操作流量,能讓流量更平穩地被系統所處理,帶給用戶更好的體驗。

我們常見的高並發場景有:淘寶的雙11、春運時的搶票、微博大V的熱點新聞等。除了這些典型事情,每秒數十萬請求的秒殺系統、每天千萬級的訂單系統、每天億級日活的資訊流系統等,都可以歸為高並發。

很顯然,上面談到的高並發場景,並發量各不相同,那到底多大並發才算高並發呢?

1、不能只看數字,要看具體的業務場景。不能說10W QPS的秒殺是高並發,而1W QPS的訊息流就不是高並發。資訊流場景涉及複雜的推薦模型和各種人工策略,它的業務邏輯可能比秒殺場景複雜10倍不止。因此,不在同一個維度,沒有任何比較意義。

2、業務都是從0到1做起來的,並發量和QPS只是參考指標,最重要的是:在業務量逐漸變成原來的10倍、100倍的過程中,你是否用到了高並發的處理方法去演進你的系統,從架構設計、編碼實現、甚至產品方案等維度去預防和解決高並發引起的問題?而不是一味的升級硬體、加機器做水平擴充。

此外,各個高並發場景的業務特徵完全不同:有讀多寫少的資訊流場景、有讀多寫多的交易場景,那是否有通用的技術方案解決不同場景的高並發問題呢

我覺得大的思路可以藉鑑,別人的方案也可以參考,但是真正落地過程中,細節上還會有無數的坑。另外,由於軟硬體環境、技術堆疊、以及產品邏輯都沒辦法做到完全一致,這些都會導致同樣的業務場景,就算用相同的技術方案也會面臨不同的問題,這些坑還得一個個趟。

因此,這篇文章我會將重點放在基礎知識、通用思路、和我曾經實踐過的有效經驗上,希望讓你對高並發有更深的理解。

02 高並發系統設計的目標是什麼?

先搞清楚高並發系統設計的目標,在此基礎上再討論設計方案和實務經驗才有意義和針對性。

#
2.1 宏觀目標

#高並發絕不表示只追求高性能,這是很多人片面的理解。 從宏觀角度看,高並發系統設計的目標有三:高效能、高可用,以及高可擴展。

1、高效能:效能體現了系統的平行處理能力,在有限的硬體投入下,提高效能意味著節省成本。同時,效能也反映了使用者體驗,回應時間分別是100毫秒和1秒,給使用者的感受是完全不同的。

2、高可用表示系統可以正常服務的時間。一個全年不停機、無故障;另一個隔三差五出線上事故、宕機,用戶肯定選擇前者。另外,如果系統只能做到90%可用,也會大大拖累業務。

3、高擴展:表示系統的擴展能力,流量高峰時能否在短時間內完成擴容,更平穩地承接尖峰流量,例如雙11活動、明星離婚等熱點事件。

面試官:你對高並發了解多少?我:emmm...

這3個目標是需要通盤考慮的,因為它們互相關聯、甚至也會互相影響。

#如說考慮系統的擴充能力,你會將服務設計#成無狀態的 #這種群集保證了高擴展性,其實也間接提升了系統的性能和可用性

再比如說:為了確保可用性,通常會對服務介面進行超時設置,以防大量執行緒阻塞在慢請求上造成系統雪崩,那超時時間設定成多少合理呢?一般,我們會參考依賴服務的效能表現進行設定。

2.2 微觀目標

再從微觀角度來看,高效能、高可用和高擴展又有哪些具體的指標來衡量?為什麼會選擇這些指標呢?

❇ 效能指標

#透過效能指標可以測量目前存在的效能問題,同時作為效能最佳化的評估依據。一般來說,會採用一段時間內的介面回應時間作為指標。

1、平均回應時間:最常用,但是缺陷很明顯,對於慢請求不敏感。例如1萬次請求,其中9900次是1ms,100次是100ms,則平均回應時間為1.99ms,雖然平均耗時僅增加了0.99ms,但是1%請求的回應時間已經增加了100倍。

2、TP90、TP99等分位值:將回應時間依照從小到大排序,TP90表示排在第90分位元的回應時間, 分位值越大,對慢請求越敏感。

面試官:你對高並發了解多少?我:emmm...

#3、吞吐量:和回應時間呈反比,例如回應時間是1ms,則吞吐量為每秒1000次。

通常,設定效能目標時會兼顧吞吐量和回應時間,例如這樣表述:在每秒1萬次請求下,AVG控制在50ms以下,TP99控制在100ms以下。對於高並發系統,AVG和TP分位值必須同時考慮。

另外,從使用者體驗角度來看,200毫秒被認為是第一個分界點,使用者感覺不到延遲,1秒是第二個分界點,使用者能感受到延遲,但是可以接受。

因此,對於一個健康的高並發系統,TP99應該控制在200毫秒以內,TP999或TP9999應該控制在1秒以內。

❇ 可用性指標

高可用性是指系統具有較高的無故障運作能力,可用性= 正常運作時間/ 系統總運作時間,一般使用幾個9來描述系統的可用性。

面試官:你對高並發了解多少?我:emmm...

對於高並發系統來說,最基本的要求是:保證3個9或4個9。原因很簡單,如果你只能做到2個9,代表有1%的故障時間,像一些大公司每年動輒千億以上的GMV或收入,1%就是10億等級的業務影響。

❇ 可擴展性指標

#面對突發流量,不可能暫時改造架構,最快的方式就是增加機器來線性提升系統的處理能力。

對於業務叢集或基礎元件來說,擴充性= 效能提升比例 / 機器增加比例,理想的擴充能力是:資源增加數倍,效能提升數倍。 通常來說,擴充能力要維持在70%以上。

但是從高並發系統的整體架構角度來看,擴展的目標不僅僅是把服務設計成無狀態就行了,因為當流量增加10倍,業務服務可以快速擴容10倍,但是資料庫可能就變成了新的瓶頸。

像是MySQL這種有狀態的儲存服務通常是擴充的技術困難,如果架構上沒有事先做好規劃(垂直和水平分割),就會涉及到大量資料的遷移。

因此,高擴展性需要考慮:服務叢集、資料庫、快取和訊息佇列等中間件、負載平衡、頻寬、依賴的第三方等,當並發達到某一個量級後,上述每個因素都可能成為擴展的瓶頸點。


#
03 高併發的實踐方案有哪些
了解了高並發設計的3大目標後,再系統性地總結下高並發的設計方案,會從以下兩部分展開:先總結下通用的設計方法,然後再圍繞高效能、高可用、高擴展分別給出具體的實踐方案。
3.1 通用的設計方法
通用的設計方法主要從縱向橫向兩個維度出發,俗稱高並發處理的兩板斧:縱向擴展和橫向擴展。

❇ 縱向擴充(scale-up)

#它的目標是提升單機的處理能力,方案又包含:

1、提升單機的硬體效能:透過增加記憶體、CPU核數、儲存容量、或將磁碟#升級成SSD等堆硬#方提升
## 。
2、提升單機的軟體效能:使用快取減少IO次數,使用並發或非同步的方式增加吞吐量。

❇ 橫向擴展(scale-out)

#因為單機效能總是會存在極限,所以最終還需要引入橫向擴展,透過叢集部署以進一步提高並發處理能力,又包含以下2個方向:


1、做好分層架構:這是橫向擴展的提前,因為高並發系統往往業務複雜,透過分層處理可以簡化複雜問題,更容易做到橫向擴展。

#######
面試官:你對高並發了解多少?我:emmm...

上面這種圖是網路最常見的分層架構,當然真實的高並發系統架構會在此基礎上進一步完善。例如會做動靜分離並引入CDN,反向代理層可以是LVS Nginx,Web層可以是統一的API網關,業務服務層可進一步按垂直業務做微服務化,儲存層可以是各種異質資料庫。

2、各層進行水平擴展:無狀態水平擴容,有狀態做分片路由。業務群集通常能設計成無狀態的,而資料庫和快取往往是有狀態的,因此需要設計分區鍵做好儲存分片,當然也可以透過主從同步、讀寫分離的方案來提升讀取效能。

3.2 具體的實踐方案
#下面再結合我的個人經驗,針對高效能、高可用、高擴充3個方面,總結下可落地的實踐方案。

❇ 高效能的實務方案

#1、叢集部署,透過負載平衡減輕單機壓力。

2、多層緩存,包括靜態資料使用CDN、本地快取、分散式快取等,以及快取場景中的熱點key、快取穿透、快取並發、資料一致性等問題的處理。
3、分庫分錶和索引最佳化,以及借助搜尋引擎解決複雜查詢問題。
4、考慮NoSQL資料庫的使用,例如HBase、TiDB等,但團隊必須熟悉這些元件,且有較強的運作能力。
5、非同步化,將次要流程透過多執行緒、MQ、甚至延時任務進行非同步處理。
6、限流,需要先考慮業務是否允許限流(例如秒殺場景是允許的),包括前端限流、Nginx存取層的限流、服務端的限流。
7、對流量進行#削峰填谷,透過 MQ承接流量。
8、並發處理,透過多執行緒將串列邏輯並行化。
9、預計算,例如搶紅包場景,可以事先計算好紅包金額快取起來,發紅包時直接使用即可
10、快取預熱,透過非同步任務提前預熱資料到本地快取或分散式快取。
11、減少IO次數,例如資料庫和快取的批次讀寫、RPC的批次介面支援、或透過冗餘資料的方式來幹掉RPC呼叫。
12、減少IO時的封包大小,包括採用輕量級的通訊協定、適當的資料結構、去掉介面中的多餘欄位、減少快取key的大小、壓縮快取value等。
13、程式邏輯最佳化,例如將大機率阻斷執行流程的判斷邏輯前置、For迴圈的運算邏輯最佳化,或是採用更有效率的演算法。
14、各種池化技術的使用和池大小的設置,包括HTTP請求池、執行緒池(考慮CPU密集型或IO密集型設定核心參數)、資料庫和Redis連接池等。
15、JVM最佳化,包括新生代和老年代的大小、GC演算法的選擇等,盡可能減少GC頻率和耗時。
16、鎖選擇,讀多寫少的場景用樂觀鎖,或考慮透過分段鎖的方式減少鎖定衝突。

上述方案無外乎從計算和IO 兩個維度考慮所有可能的優化點,需要有配套的監控系統實時了解當前的性能表現,並支撐你進行效能瓶頸分析,然後再遵循二八原則,抓主要矛盾進行最佳化。

❇ 高可用的實踐方案

#1、對等節點的故障轉移,Nginx和服務治理框架都支援一個節點失敗後訪問另一個節點。

2、非對等節點的故障轉移,透過心跳偵測並實作主備切換(例如redis的哨兵模式或叢集模式、MySQL的主從切換等)。
3、介面層面的超時設定、重試策略和冪等設計
4、降級處理:確保核心服務,犧牲非核心服務,必要時進行熔斷;或核心連結出問題時,有備選連結。
5、限流處理:對超過系統處理能力的請求直接拒絕或回傳錯誤碼。
6、MQ場景的訊息可靠性保證,包含producer端的重試機制、broker側的持久化、consumer端的ack機制等。
7、灰階發布,能支援以機器維度進行小流量部署,觀察系統日誌和業務指標,等運行平穩後再推全量。
8、監控警報:全方位的監控體系,包含最基礎的CPU、記憶體、磁碟、網路的監控,以及Web伺服器、JVM、資料庫、各類中介軟體的監控和業務指標的監控。
9、災備演練:類似當前的“混沌工程”,對系統進行一些破壞性手段,觀察局部故障是否會引起可用性問題。

高可用的方案主要從冗餘、取捨、系統運維3個方向考慮,同時需要有配套的值班機制和故障處理流程,當出現線上問題時,可及時跟進處理。

❇ 高擴展的實踐方案

#1、合理的分層架構:例如上面談到的網路最常見的分層架構,另外還能進一步依照資料存取層、業務邏輯層對微服務做更細粒度的分層(但是需要評估效能,會存在網路多一跳的情況)。

2、儲存層的拆分:依照業務維度做垂直拆分、依照資料特徵維度進一步做水平拆分(分庫分錶)。
3、業務層的分割:最常見的是依照業務維度拆(例如電商場景的商品服務、訂單服務等),也可以依照核心介面和非核心介面拆,也可以依照請求源拆(例如To C和To B,APP和H5)。


#
最後的話

高並發確實是一個複雜且系統性的問題,由於篇幅有限,諸如分散式Trace、全鏈路壓測、柔性事務都是要考慮的技術點。另外,如果業務場景不同,高並發的落地方案也會有差異,但是整體的設計思路和可參考的方案基本上類似。

高並發設計同樣要秉承架構設計的3個原則:簡單、合適和演進。 “過早的優化是萬惡之源”,不能脫離業務的實際情況,更不要過度設計,合適的方案就是最完美的。

希望這篇文章能帶給你關於高並發更全面的認識,如果你也有可藉鑑的經驗和深入的思考,歡迎評論區留言討論。

#

以上是面試官:你對高並發了解多少?我:emmm...的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

五個常見的Go語言面試問題及解答 五個常見的Go語言面試問題及解答 Jun 01, 2023 pm 08:10 PM

作為近年來備受熱捧的程式語言,Go語言已成為許多公司與企業的面試熱點。對於Go語言初學者而言,在面試過程中遇到相關問題時,如何回答是一個值得探討的問題。以下列舉五個常見的Go語言面試題目及解答,供初學者參考。請介紹一下Go語言的垃圾回收機制是如何運作的? Go語言的垃圾回收機制是基於標記-清除演算法和三色標記演算法。當Go程式中的記憶體空間不夠用時,Go垃圾回收器

2023年前端React面試題大總結(收藏) 2023年前端React面試題大總結(收藏) Aug 04, 2020 pm 05:33 PM

php中文網作為知名程式設計學習網站,為您整理了一些React面試題,幫助前端開發人員準備和清除React面試障礙。

2023年精選Web前端面試題大全及答案(收藏) 2023年精選Web前端面試題大全及答案(收藏) Apr 08, 2021 am 10:11 AM

本篇文章為大家總結一些值得收藏的精選Web前端面試題(附答案)。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

50個你必須掌握的Angular面試題(收藏) 50個你必須掌握的Angular面試題(收藏) Jul 23, 2021 am 10:12 AM

這篇文章跟大家分享50個必須掌握的Angular面試題,會從初學者-中級-高級三個部分來解析這50個面試題,帶大家吃透它們!

面試官:你對高並發了解多少?我:emmm... 面試官:你對高並發了解多少?我:emmm... Jul 26, 2023 pm 04:07 PM

高並發,幾乎是每個程式設計師都想擁有的經驗。原因很簡單:隨著流量變大,會遇到各種各樣的技術問題,例如介面響應逾時、CPU load升高、GC頻繁、死鎖、大數據量儲存等等,這些問題能推動我們在技術深度上不斷精進。

2023年vue高頻面試題分享(附答案分析) 2023年vue高頻面試題分享(附答案分析) Aug 01, 2022 pm 08:08 PM

本篇文章為大家總結一些值得收藏的2023年精選vue高頻面試題(附答案)。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

看看這些前端面試題,帶你搞定高頻知識點(四) 看看這些前端面試題,帶你搞定高頻知識點(四) Feb 20, 2023 pm 07:19 PM

每天10題,100天后,搞定所有前端面試的高頻知識點,加油! ! ! ,在看文章的同時,希望不要直接看答案,先思考一下自己會不會,如果會,自己的答案是什麼?想過之後再與答案比對,是不是會好一點,當然如果你有比我更好的答案,歡迎留言區留言,一起探討技術之美。

總結一些前端常見面試題(附答案),帶你鞏固知識點! 總結一些前端常見面試題(附答案),帶你鞏固知識點! Jul 29, 2022 am 09:49 AM

發布文章主要也是鞏固自己的知識更加熟練,全憑自己的理解和網上查資料總結出來的,如有不對的地方還望多多指點。以下是我總結的常見面試題,為了督促自己還可以會繼續更新

See all articles