




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、關(guān)于系統(tǒng)“高并發(fā)”問題的理解及實踐優(yōu)化方案高并發(fā),幾乎是每個程序員都想擁有的經(jīng)驗。原因很簡單:隨著流量變大,會遇到各種各樣的技術(shù)問題,比如接口響應超時、CPU Ioad升高、GC頻繁、死鎖、大數(shù)據(jù)量存儲等等,這些問題能推動我們在技術(shù)深度上不斷精進。這篇文章,我想結(jié)合自己的高并發(fā)項目經(jīng)驗,系統(tǒng)性地總結(jié)下高并發(fā)需要掌握的知識 和實踐思路,希望對你有所幫助。內(nèi)容分成以下 3 個部分:如何理解高并發(fā)?高并發(fā)系統(tǒng)設(shè)計的目標是什么?高并發(fā)的實踐方案有哪些?一、如何理解高并發(fā)?高并發(fā)意味著大流量,需要運用技術(shù)手段抵抗流量的沖擊,這些手段好比操作流量, 能讓流量更平穩(wěn)地被系統(tǒng)所處理,帶給用戶更好的體驗。我們常
2、見的高并發(fā)場景有:淘寶 的雙11、春運時的搶票、微博大 V的熱點新聞等。除了這些典型事情,每秒幾十萬請求的 秒殺系統(tǒng)、每天千萬級的訂單系統(tǒng)、每天億級日活的信息流系統(tǒng)等,都可以歸為高并發(fā)。 很顯然,上面談到的高并發(fā)場景,并發(fā)量各不相同,那到底多大并發(fā)才算高并發(fā)呢?1、 不能只看數(shù)字,要看具體的業(yè)務場景。不能說10W QPS勺秒殺是高并發(fā),而 1W QPS的信息流就不是高并發(fā)。信息流場景涉及復雜的推薦模型和各種人工策略,它的業(yè)務 邏輯可能比秒殺場景復雜 10倍不止。因此,不在同一個維度,沒有任何比較意義。2、業(yè)務都是從0到1做起來的,并發(fā)量和 QPS只是參考指標,最重要的是:在業(yè)務量 逐漸變成原來
3、的 10 倍、 100 倍的過程中,你是否用到了高并發(fā)的處理方法去嚴謹你的系 統(tǒng),從架構(gòu)設(shè)計、編碼實現(xiàn)、甚至產(chǎn)品方案等維度去預防和解決高并發(fā)引起的問題?而不 是一味的升級硬件、加機器做水平擴展。此外,各個高并發(fā)場景的業(yè)務特點完全不同:有讀多寫少的信息流場景、有讀多寫多 的交易場景,那是否有通用的技術(shù)方案解決不同場景的高并發(fā)問題呢?我覺得大的思路可以借鑒,別人的方案也可以參考,但是真正落地過程中,細節(jié)上還 會有無數(shù)的坑。另外,由于軟硬件環(huán)境、技術(shù)棧、以及產(chǎn)品邏輯都沒法做到完全一致,這 些都會導致同樣的業(yè)務場景,就算用相同的技術(shù)方案也會面臨不同的問題,這些坑還得一 個個趟。因此,這篇文章我會將重點
4、放在基礎(chǔ)知識、通用思路、和我曾經(jīng)實踐過的有效經(jīng) 驗上,希望讓你對高并發(fā)有更深的理解。、高并發(fā)系統(tǒng)設(shè)計的目標是什么?先搞清楚高并發(fā)系統(tǒng)設(shè)計的目標,在此基礎(chǔ)上再討論設(shè)計方案和實踐經(jīng)驗才有意義和 針對性。2.1宏觀目標高并發(fā)絕不意味著只追求高性能,這是很多人片面的理解。從宏觀角度看,高并發(fā)系 統(tǒng)設(shè)計的目標有三個:高性能、高可用,以及高可擴展。(1)高性能:性能體現(xiàn)了系統(tǒng)的并行處理能力,在有限的硬件投入下,提高性能意味著節(jié)省成本。同時,性能也反映了用戶體驗,響應時間分別是100毫秒和1秒,給用戶的感受是完全不同的。(2)高可用:表示系統(tǒng)可以正常服務的時間。一個全年不停機、無故障;另一個隔三差五出現(xiàn)上事
5、故、宕機,用戶肯定選擇前者。另外,如果系統(tǒng)只能做到90%可用,也會大大拖累業(yè)務。(3)高擴展:表示系統(tǒng)的擴展能力,流量高峰時能否在短時間內(nèi)完成擴容,更平穩(wěn)地 承接峰值流量,比如雙 11活動、明星離婚等熱點事件。高性能,高并發(fā)高擴展咼可用這3個目標是需要通盤考慮的,因為它們互相關(guān)聯(lián)、甚至也會相互影響。比如說:考慮系統(tǒng)的擴展能力,你會將服務設(shè)計成無狀態(tài)的,這種集群設(shè)計保證了高擴展性,其實也 間接提升了系統(tǒng)的性能和可用性。再比如說:為了保證可用性,通常會對服務接口進行超時設(shè)置,以防大量線程阻塞在慢請求上造成系統(tǒng)雪崩,那超時時間設(shè)置成多少合理呢?一般,我們會參考依賴服務的性 能表現(xiàn)進行設(shè)置。2.2微觀
6、目標再從微觀角度來看,高性能、高可用和高擴展又有哪些具體的指標來衡量?為什么會選擇這些指標呢?2.2.1性能指標通過性能指標可以度量目前存在的性能問題,同時作為性能優(yōu)化的評估依據(jù)。一般來說,會采用一段時間內(nèi)的接口響應時間作為指標。(1) 平均響應時間:最常用,但是缺陷很明顯,對于慢請求不敏感。比如1萬次請 求,其中9900次是1ms, 100次是100ms,則平均響應時間為 1.99ms ,雖然平均耗時僅增 加了 0.99ms,但是1%青求的響應時間已經(jīng)增加了 100倍。(2) TP90、TP99等分位值:將響應時間按照從小到大排序,TP90表示排在第90分位的響應時間,分位值越大,對慢請求越
7、敏感。L/jImSImSImSImS2ms3ms4ms假設(shè)100個請求,排在第99位的響應時間即TP99TP99分位(3)吞吐量:和響應時間呈反比,比如響應時間是1ms,則吞吐量為每秒 1000次。通常,設(shè)定性能目標時會兼顧吞吐量和響應時間,比如這樣表述:在每秒1萬次請求下,AVG控制在50ms以下,TP99控制在100ms以下。對于高并發(fā)系統(tǒng), AVG和TP分位值 必須同時要考慮。另外,從用戶體驗角度來看,200毫秒被認為是第一個分界點,用戶感覺不到延遲,1秒是第二個分界點,用戶能感受到延遲,但是可以接受。因此,對于一個健康的高并發(fā)系統(tǒng),TP99應該控制在200毫秒以內(nèi),TP999或者TP9
8、999應該控制在1秒以內(nèi)。2.2.2可用性指標高可用性是指系統(tǒng)具有較高的無故障運行能力,可用性平均故障時間/系統(tǒng)總運行時間,一般使用幾個 9來描述系統(tǒng)的可用性。90% (1 個9)99% (2個9)36.5 天3.65 天2.4小時144分鐘99.9% (3個9)99.99% (4個9)8小吋52分鐘1.44分鐘8.6秒99.999% (5個9)5分鐘0.86 秒對于高并發(fā)系統(tǒng)來說,最基本的要求是:保證3個9或者4個9。原因很簡單,如果你只能做到2個9,意味著有1%勺故障時間,像一些大公司每年動輒千億以上的GMX或者 收入,1%猶是10億級別的業(yè)務影響。223可擴展性指標面對突發(fā)流量,不可能臨
9、時改造架構(gòu),最快的方式就是增加機器來線性提高系統(tǒng)的處理能力。對于業(yè)務集群或者基礎(chǔ)組件來說,擴展性=性能提升比例/機器增加比例,理想的擴展能力是:資源增加幾倍,性能提升幾倍。通常來說,擴展能力要維持在70%從 上。但是從高并發(fā)系統(tǒng)的整體架構(gòu)角度來看,擴展的目標不僅僅是把服務設(shè)計成無狀態(tài)就行了,因為當流量增加 10倍,業(yè)務服務可以快速擴容10倍,但是數(shù)據(jù)庫可能就成為了新的瓶頸。像MySQL這種有狀態(tài)的存儲服務通常是擴展的技術(shù)難點,如果架構(gòu)上沒提前做好 規(guī)劃(垂直和水平拆分),就會涉及到大量數(shù)據(jù)的遷移。因此,高擴展性需要考慮:服務集群、數(shù)據(jù)庫、緩存和消息隊列等中間件、負載均衡、帶寬、依賴的第三方等,
10、當并發(fā)達到某一個量級后,上述每個因素都可能成為擴展的瓶頸點。三、高并發(fā)的實踐方案有哪些?了解了高并發(fā)設(shè)計的 3大目標后,再系統(tǒng)性總結(jié)下高并發(fā)的設(shè)計方案,會從以下兩部分展開:先總結(jié)下通用的設(shè)計方法,然后再圍繞高性能、高可用、高擴展分別給出具體的 實踐方案。3.1通用的設(shè)計方法通用的設(shè)計方法主要是從縱向和橫向兩個維度出發(fā),俗稱高并發(fā)處理的兩板 斧:縱向擴展和橫向擴展。3.1.1 縱向擴展(SCale-UP )它的目標是提升單機的處理能力,方案又包括:(1) 提升單機的硬件性能:通過增加內(nèi)存、CPU核數(shù)、存儲容量、或者將磁盤升級成 SSD等堆硬件的方式來提升。(2) 提升單機的軟件性能:使用緩存減少
11、IO次數(shù),使用并發(fā)或者異步的方式增加吞 吐量。3.1.2 橫向擴展(SCaIe-OUt )因為單機性能總會存在極限,所以最終還需要引入橫向擴展,通過集群部署以進一步 提高并發(fā)處理能力,又包括以下2個方向:(1)做好分層架構(gòu):這是橫向擴展的提前,因為高并發(fā)系統(tǒng)往往業(yè)務復雜,通過分層 處理可以簡化復雜問題,更容易做到橫向擴展。寫請求讀請求面這種圖是互聯(lián)網(wǎng)最常見的分層架構(gòu),當然真實的高并發(fā)系統(tǒng)架構(gòu)會在此基礎(chǔ)上進一步完善。比如會做動靜分離并引入CDN反向代理層可以是 LVS+Nginx, Web層可以是統(tǒng)一的 API 網(wǎng)關(guān),業(yè)務服務層可進一步按垂直業(yè)務作為服務化,存儲層可以是各種異構(gòu)數(shù)據(jù) 庫。( 2)
12、各層進行水平擴展:無狀態(tài)水平擴容,有狀態(tài)做分片路由。業(yè)務集群通常能設(shè)計 成無狀態(tài)的,而數(shù)據(jù)庫和緩存往往是有狀態(tài)的,因此需要設(shè)計分區(qū)鍵做好存儲分片,當然 也可以通過主從同步、讀寫分離的方案提升讀性能。3.2 具體的實踐方案下面再結(jié)合我的個人經(jīng)驗,針對高性能、高可用、高擴展3 個方面,總結(jié)下可落地的實踐方案。3.2.1 高性能的實踐方案( 1)集群部署,通過負載均衡減輕單機壓力。(2)多級緩存,包括靜態(tài)數(shù)據(jù)使用CDN本地緩存、分布式緩存等,以及對緩存場景中的熱點 key 、緩存穿透、緩存并發(fā)、數(shù)據(jù)一致性等問題的處理。( 3)分庫分表和索引優(yōu)化,以及借助搜索引擎解決復雜查詢問題。(4)考慮NoSQL
13、數(shù)據(jù)庫的使用,比如 HBaSe TiDB等,但是團隊必須熟悉這些組件, 且有較強的運維能力。(5) 異步化,將次要流程通過多線程、MQ甚至延時任務進行異步處理。( 6)限流,需要先考慮業(yè)務是否允許限流(比如秒殺場景是允許的),包括前端限流、 Nginx 接入層的限流、服務端的限流。(7)對流量進行削峰填谷,通過MQ承接流量。( 8)并發(fā)處理,通過多線程將串行邏輯并行化。( 9)預計算,比如搶紅包場景,可以提前計算好紅包金額緩存起來,發(fā)紅包時直接使 用即可。( 10)緩存預熱,通過異步任務提前預熱數(shù)據(jù)到本地緩存或者分布式緩存中。(11) 減少IO次數(shù),比如數(shù)據(jù)庫和緩存的批量讀寫、RPC的批量接口
14、支持、或者通過 冗余數(shù)據(jù)的方式干掉 RPC調(diào)用。(12)減少IO時的數(shù)據(jù)包大小,包括采用輕量級的通信協(xié)議、合適的數(shù)據(jù)結(jié)構(gòu)、去掉 接口中的多余字段、減少緩存 key 的大小、壓縮緩存 value 等。For 循環(huán)的計算13)程序邏輯優(yōu)化,比如將大概率阻斷執(zhí)行流程的判斷邏輯前置、邏輯優(yōu)化,或者采用更高效的算法。(14) 各種池化技術(shù)的使用和池大小的設(shè)置,包括HTTP請求池、線程池(考慮 CPU密 集型還是 IO 密集型設(shè)置核心參數(shù)) 、數(shù)據(jù)庫和 Redis 連接池等。(15) JVM優(yōu)化,包括新生代和老年代的大小、GC算法的選擇等,盡可能減少GC頻率和耗時。( 16)鎖選擇,讀多寫少的場景用樂觀鎖
15、,或者考慮通過分段鎖的方式減少鎖沖突。 上述方案無外乎從計算和 IO 兩個維度考慮所有可能的優(yōu)化點,需要有配套的監(jiān)控系 統(tǒng)實時了解當前的性能表現(xiàn),并支撐你進行性能瓶頸分析,然后再遵循二八原則,抓主要 矛盾進行優(yōu)化。3.2.2 高可用的實踐方案( 1 )對等節(jié)點的故障轉(zhuǎn)移, Nginx 和服務治理框架均支持一個節(jié)點失敗后訪問另一個 節(jié)點。( 2)非對等節(jié)點的故障轉(zhuǎn)移,通過心跳檢測并實施主備切換(比如redis 的哨兵模式或者集群模式、MySQL的主從切換等)。( 3)接口層面的超時設(shè)置、重試策略和冪等設(shè)計。( 4)降級處理:保證核心服務,犧牲非核心服務,必要時進行熔斷;或者核心鏈路出 問題時,有
16、備選鏈路。(5) 限流處理:對超過系統(tǒng)處理能力的請求直接拒絕或者返回錯誤碼。(6) MQ場景的消息可靠性保證,包括ProdUCer端的重試機制、broker側(cè)的持久化、 consumer 端的 ack 機制等。( 7)灰度發(fā)布,能支持按機器維度進行小流量部署,觀察系統(tǒng)日志和業(yè)務指標,等運 行平穩(wěn)后再推全量。(8)監(jiān)控報警:全方位的監(jiān)控體系,包括最基礎(chǔ)的CPU內(nèi)存、磁盤、網(wǎng)絡(luò)的監(jiān)控,以及Web服務器、JVM數(shù)據(jù)庫、各類中間件的監(jiān)控和業(yè)務指標的監(jiān)控。( 9)災備演練:類似當前的“混沌工程”,對系統(tǒng)進行一些破壞性手段,觀察局部故 障是否會引起可用性問題。高可用的方案主要從冗余、取舍、系統(tǒng)運維 3 個方向考慮,同時需要有配套的值班機 制和故障處理流程,當出現(xiàn)線上問題時,可及時跟進處理。3.2.3 高擴展的實踐方案(1)合理的分層架構(gòu):比如上面談到的互聯(lián)網(wǎng)最常見的分層架構(gòu),另外還能進一步按 照數(shù)據(jù)訪問層、業(yè)務邏輯層對微服務做更細粒度的分層(但是需要評估性能,會存在網(wǎng)絡(luò) 多一跳的情況) 。(2)存儲層的拆分:按照業(yè)務維度做垂直拆分、按照數(shù)據(jù)特征維度進一步做水平拆分 (分庫分表) 。(3)業(yè)務層的拆分:最常見的是按照業(yè)務維度
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《GBT42293-2022商品交易市場知識產(chǎn)權(quán)保護規(guī)范》(2025版)深度解析
- 網(wǎng)梯課件制作工具系統(tǒng)目標 - 互動教學課件設(shè)計指南
- 小學社團活動組織與實施
- 2025年入團考試試題及答案知識點梳理
- 中醫(yī)護理培訓核心內(nèi)容
- 初中歷史解題策略(課件)
- 餐廳收銀員培訓體系構(gòu)建
- 醫(yī)學健康知識普及講座
- 煤礦實業(yè)公司主輔分離工作總結(jié)模版
- 《線上活動實施計劃》課件
- 【MOOC答案】《中國文化傳承與科技創(chuàng)新》(北京郵電大學)中國慕課章節(jié)作業(yè)網(wǎng)課答案
- 郵政社招筆試題庫
- 2023年黑龍江省黑河市公開招聘警務輔助人員(輔警)筆試必刷經(jīng)典測試卷(1)含答案
- 《真希望你也喜歡自己》房琪-讀書分享
- 大班沙水游戲教案30篇
- 粵人版(2024新版)七年級上冊地理期末復習考點背誦提綱
- 《危險化學品建設(shè)項目安全設(shè)施設(shè)計專篇編制導則》編制說明
- 配電室消防應急預案
- 膝關(guān)節(jié)穿刺術(shù)
- 青儲飼料購銷合同范本版
- JT-T-1208-2018國際道路貨物運輸車輛選型技術(shù)要求
評論
0/150
提交評論