如何獲得高并發(fā)的項目經(jīng)驗?
在互聯(lián)網(wǎng)公司,經(jīng)常面臨一個“三高”問題: 高并發(fā)、高性能、高可用。
我們經(jīng)常收到一些同學(xué)提問: 我沒有高并發(fā)項目經(jīng)驗,工作中沒有這樣的場景。 但是面試的時候經(jīng)常被問到高并發(fā)、性能調(diào)優(yōu)方面的問題,有什么辦法可以學(xué)習(xí)或者解決嗎?
這種時候,你需要有一個全局的技術(shù)視野,熟悉一些常用的系統(tǒng)優(yōu)化方法論,以及學(xué)會一些關(guān)于系統(tǒng)設(shè)計的解答思路。
今天我們邀請了 3 名淘系技術(shù)工程師,給大家分享一些他們在高并發(fā)項目的學(xué)習(xí)實踐經(jīng)驗&面試回答經(jīng)驗,希望能夠?qū)δ阌袔椭?/p>
01
淘系技術(shù)部-產(chǎn)品技術(shù)-昭明
“ 高并發(fā)系統(tǒng)是可遇不可求的,但其實是可以通過壓測來模擬的。”
現(xiàn)實中,哪怕是大公司,高并發(fā)系統(tǒng)也是可遇不可求的。不過,高并發(fā)其實是可以通過壓測來模擬的。
高并發(fā)的背后,核心是高可用和低延遲。所以我們其實是想有能力設(shè)計一個系統(tǒng),在高并發(fā)訪問的時候,系統(tǒng)依然可用,而且響應(yīng)速度不會變慢。
想提升高并發(fā)系統(tǒng)的設(shè)計和開發(fā)能力,有2個方面:
-
系統(tǒng)的學(xué)習(xí)相關(guān)理論;
-
找一個目標(biāo)系統(tǒng),不斷想辦法去提升他的性能。
前者是后者的理論基礎(chǔ)。
如果想從事一個高并發(fā)系統(tǒng)開發(fā)的崗位,要學(xué)習(xí)的相關(guān)技術(shù)其實是很多的,這些技術(shù)核心就是解決高并發(fā)情況下如何保持系統(tǒng)的高可用和低延遲。
以Java工程師為例,互聯(lián)網(wǎng)程序員面試中經(jīng)常會考察的內(nèi)容包括:
架構(gòu)設(shè)計
高可用與穩(wěn)定性、事務(wù)一致性、多副本一致性、CAP理論。
相關(guān)技術(shù)
多線程(JUC/AQS/線程池)、RPC調(diào)用及框架(如Thrift)、NIO及NIO框架(如Netty)、高并發(fā)框架(如Disruptor) 、微服務(wù)框架(SpringBoot)、微服務(wù)治理(Spring Cloud)、數(shù)據(jù)庫相關(guān)技術(shù)(如:索引優(yōu)化、分庫分表、讀寫分離)、分布式緩存(如redis)、消息中間件系統(tǒng)(如RabbitMQ)、容器技術(shù)(如docker)。
工具
系統(tǒng)性能查看(top、uptime、vmstat、iostat)、壓測工具(如ab、locust、Jmeter、go)、線程分析(如jps、jstack)等。
當(dāng)然,一開始,我們不可能逐一把這些技能全部掌握,我們可以從一個實際項目入手,不斷的把這些技術(shù)用上去,發(fā)現(xiàn)哪些知識不足,再去補充相關(guān)的知識。
“如何設(shè)計一個好的秒殺系統(tǒng)“,一定是互聯(lián)網(wǎng)大廠面試中最常問的一個問題。所以從設(shè)計一個秒殺系統(tǒng)開始實踐,是個不錯的選擇。
秒殺系統(tǒng)的特點:
-
瞬時并發(fā)量大
秒殺時會 有大量用戶在同一時間進行搶購,瞬時并發(fā)訪問量突增 10 倍,甚至 100 倍以上都有。
-
庫存量少
一般秒殺活動商品量很少,這就導(dǎo)致了只有極少量用戶能成功購買到。
-
業(yè)務(wù)簡單
流程比較簡單,一般都是下訂單、扣庫存、支付訂單。
設(shè)計秒殺系統(tǒng)的關(guān)鍵點
-
限流
由于活動庫存量一般都是很少,對應(yīng)的只有少部 分用戶才能秒殺成功。所以我們需要限制大部分用戶流量,只準(zhǔn)少量用戶流量進 入后端服務(wù)器。
-
削峰
秒殺開始的那一瞬間,會有大量用戶沖擊進來,所以在開始時候會有一個瞬間流量峰值。如何把瞬間的流量峰值變得 更平緩,是能否成功設(shè)計好秒殺系統(tǒng)的關(guān)鍵因素。實現(xiàn)流量削峰填谷,一般的采用緩存和 MQ 中間件來解決。
-
異步
秒殺其實可以當(dāng)做高并發(fā)系統(tǒng)來處理,在這個時候 ,可以考慮從業(yè)務(wù)上做兼容,將同步的業(yè)務(wù),設(shè)計成異步處理的任務(wù),提高網(wǎng)站的整 體可用性。
-
緩存
秒殺系統(tǒng)的瓶頸主要體現(xiàn)在下訂單、扣減庫存流程中。在這些流程中主要用到 OLTP 的數(shù)據(jù)庫,類似 MySQL、Orac le。由于數(shù)據(jù)庫底層采用 B+ 樹的儲存結(jié)構(gòu),對應(yīng)我們隨機寫入與讀取的效率,相對較低。如果我們把部分業(yè)務(wù)邏輯遷移到內(nèi)存的緩存或者 Redis 中,會極大的提高并 發(fā)效率。
從0到1搭建一個秒殺系統(tǒng),也并不 容易,涉及到很多前端、后端、中間件的技術(shù)。這個跟其實是所有公司的工作常態(tài),大部分時間也是在搭架子,真正做技術(shù)優(yōu)化的時間并不多,經(jīng)常是在業(yè)務(wù)量突增或 者大促活動來臨時,集中搞一波性能優(yōu)化。
所以,如果沒有實際的高并發(fā)項目可做,自己弄個秒殺系統(tǒng)自娛自樂也是不錯的。
搭建系統(tǒng) -> 壓測 -> 發(fā)現(xiàn)問題 -> 學(xué)習(xí)知識 -> 優(yōu)化系統(tǒng),通過這樣的循環(huán),相信你一定既能體驗到學(xué)習(xí)的樂趣,同時實力也大幅提升。
02
淘系技術(shù)部-行業(yè)與智能運營架構(gòu)組-仲春
“在面試時被問到高并發(fā)經(jīng)驗時不要慌,按照以下過 程表達(dá)即可體現(xiàn)你的高并發(fā)設(shè)計能力:優(yōu)化單請求耗時、提高單機并發(fā)能力、提 高整體并發(fā)能力。”
個人認(rèn)為,其實我們并不用去追求嚴(yán)格意義上的高并發(fā)經(jīng)驗,因為很多時候都沒有這樣的機會給到你,對于高并發(fā)的處理經(jīng)驗主要體現(xiàn)在日常的積累以及對自己的嚴(yán)格要求上。
為什么總在說高并發(fā)?
在并發(fā)不高的場景下,不區(qū)分經(jīng)驗是否豐富的任何人都能完成基本的業(yè)務(wù)開發(fā),而且不會產(chǎn)生任何性能問題,下游依賴、底層存儲依賴都不會對你的系統(tǒng)產(chǎn)生影響,但是在并發(fā)很高的時候,一切都變了,可能由于高并發(fā)環(huán)境時下游抖了幾ms、db由于高寫入或者備庫讀壓力過大而導(dǎo)致主備延遲了一下,你的系統(tǒng)或者業(yè)務(wù)都會產(chǎn)生故障。
如何積攢“經(jīng)驗”?
對于這個問題,我總結(jié)3點可落地:
-
系統(tǒng)的設(shè)計優(yōu)化
首先 系統(tǒng) 只有無狀態(tài)的,才能不斷橫向擴展,才能支撐流量的變化,在業(yè)務(wù)層的高并發(fā)大多都需要不斷擴容來支持,但是擴容也不是最根本的方式,如果系統(tǒng)不做優(yōu)化,一開始擴容大概率是有效的,到一 定階段后就會發(fā)現(xiàn)情況開始惡化,因為底層的依賴競爭開始激烈,失敗開始增多。優(yōu)化的盡頭往往是對下游依賴和底層數(shù)據(jù)層的優(yōu)化,解決方案大多是常見的緩存分層、讀寫分離、分庫分表、異步化等等,但是引入這些技術(shù)方案時,會帶來一些副作用,接下來你需要解決和屏蔽這些副作用。
-
業(yè)務(wù)邏輯的優(yōu)化
當(dāng)你只是在負(fù)責(zé)一個流量不大的系統(tǒng)時,是否就沒有高并發(fā)的機會了呢?其實不然,你需要不斷嚴(yán)格要求自己,讓業(yè)務(wù)跑的更快,例如:將單次請求響應(yīng)耗時從100ms優(yōu)化到20ms;單機能力從100qps提高到500qps,同時cpu消耗上漲不明顯;優(yōu)化單次請求對緩存和db的放大系數(shù)降低,減少對緩存和db的壓力。在這個過程中你將積累大量的實戰(zhàn)經(jīng)驗,完成業(yè)務(wù)開發(fā)很簡單,但是完成一個高效且具備高擴展性的業(yè)務(wù)開發(fā)卻是很難的,往前多想幾步,你會收獲很多。
-
壓測驗證
在業(yè)務(wù)體量沒有高并發(fā)的情況下,只有自己人為創(chuàng)造流量來驗證(不過前提是你的系統(tǒng)支持全鏈路壓測,否則壓測數(shù)據(jù)會污染線上真實環(huán)境,如果暫時不支持,那么恭喜你,你有機會做一次全鏈路壓測改造了),通過驗證在目標(biāo)水位下的系統(tǒng)表現(xiàn)、機器表現(xiàn),再繼續(xù)重復(fù)前面兩個過程,不斷迭代,直到無法扣細(xì)節(jié),提高性能;
如何展示自己的高并發(fā)經(jīng)驗?
只要在日常研發(fā)過程中嚴(yán)以律己,做好各項設(shè)計和優(yōu)化,不隨意寫難易擴展和難易維護的代碼,面試的時候就能聊下去。在面試時被問到高并發(fā)經(jīng)驗時不要慌,只要按照以下過程表達(dá)即可體現(xiàn)你的高并發(fā)設(shè)計能力:
-
如何優(yōu)化單請求耗時
這里你會闡述如何設(shè)計和改造系統(tǒng)架構(gòu),有可能涉及到j(luò)vm的參數(shù)優(yōu)化、各種依賴是如何選型,過程中你積累了哪些選型和優(yōu)化的方式;
-
如何提高單機并發(fā)能力
這里你會闡述在你的業(yè)務(wù)中,單機并發(fā)能力受限于哪些關(guān)鍵點,這里主要的挑戰(zhàn)點是單機的限制條件以及單機資源的競爭,你是如何設(shè)計克服的,過程中你積累了哪些設(shè)計原則;
-
如何提高整體并發(fā)能力
這里你會闡述在集群環(huán)境下最重要的亮點,就是如何處理跨機器的資源競爭以及數(shù)據(jù)的一致性問題,這里將體現(xiàn)你整體業(yè)務(wù)架構(gòu)設(shè)計能力;
綜上所述,面試時并不是要求你一定要有真實高并發(fā)的項目經(jīng)驗,項目經(jīng)驗只是為了驗證你真的做過一些設(shè)計和優(yōu)化,如果你能將高并發(fā)場景下的設(shè)計原則和可能遇到的問題場景和解法都表達(dá)清楚,那么我相信面試官也是認(rèn)可的。
03
淘系技術(shù)部-淘系基礎(chǔ)架構(gòu)-羅集
“對于高并發(fā)系統(tǒng)設(shè)計,個人推薦可以自底向上的分成三個部分,首先是建立基礎(chǔ)知識體系,其次是熟悉業(yè)界解決方案,最后是分布式系統(tǒng)設(shè)計。 ”
首先高并發(fā)的系統(tǒng)也不是最初就設(shè)計出來的, 一切解決方案都是來自于業(yè)務(wù)場景 。
大多是針對特定時期內(nèi)的問題與挑戰(zhàn),一步一步演化出來的。即便是在有高并發(fā)場景的公司里的研發(fā)同學(xué),如果不是去參與解決這些問題,往往也不能直接獲得高并發(fā)的經(jīng)驗積累。所以沒有場景的公司里面的研發(fā)同學(xué),大家的起點其實是差不多的,完全不用虛,關(guān)鍵還是在于掌握其中的核心科技。
對于高并發(fā)系統(tǒng)設(shè)計,個人推薦可以自底向上的分成三個部分,首先是 建立基礎(chǔ)知識體系 ,其次是 熟悉業(yè)界解決方案 ,最后是 分布式系統(tǒng)設(shè)計 。
知識體系的建立要更多的去關(guān)注底層,如算法、緩存、多線程、并發(fā)、JVM、OS、網(wǎng)絡(luò)、分布式理論等,這些東西相對穩(wěn)定,在這些底層技術(shù)的基礎(chǔ)上的解決方案好像層出不窮,如各種緩存技術(shù)、各種消息隊列、各種數(shù)據(jù)庫。但是掌握了底層原理,再去看上層的解決方案就能有觸類旁通的效果。對于最后的分布式系統(tǒng)設(shè)計,就是針對具體業(yè)務(wù)場景去應(yīng)用相應(yīng)的技術(shù),組裝成一套體系的方案。
對于知識的學(xué)習(xí)資料網(wǎng)上已經(jīng)非常多,可以自行學(xué)習(xí)建立體系。自己公司沒有具體的場景,就去各大公司的技術(shù)博客學(xué)習(xí)業(yè)界方案。業(yè)界方案的學(xué)習(xí)推薦更多的思考其中的原因(Why),這個才是系統(tǒng)設(shè)計的核心。
比如一個環(huán)節(jié)拿掉會對系統(tǒng)產(chǎn)生什么樣的影響?換成另外一個技術(shù)會有什么不同?下面主要講一下面試中對于系統(tǒng)設(shè)計的解答思路。
第一步,提取設(shè)計目標(biāo)
分布式系統(tǒng)設(shè)計中一定要明確自己的設(shè)計目標(biāo),比如系統(tǒng)的延遲和吞吐量,有時候是不可兼得的,會直接影響到具體的技術(shù)選型。面試中自己沒有實際的項目不要緊,可以針對某個假設(shè)的業(yè)務(wù)場景提取出系統(tǒng)設(shè)計的假設(shè),多與面試官溝通交流,說明清楚自己是基于怎樣的需求來做這個設(shè)計。
第二步,核心模塊設(shè)計
接下來就是對系統(tǒng)的建模,需要哪幾個核心模塊,這個階段主要關(guān)注功能的滿足,比如核心的算法選擇,數(shù)據(jù)模型設(shè)計。
第三步,擴展設(shè)計
識別系統(tǒng)的瓶頸點,結(jié)合所需要達(dá)到的系統(tǒng)指標(biāo)。合理的對系統(tǒng)分層,并選用常見的擴展技術(shù),如:
-
負(fù)載均衡
-
水平擴展
-
緩存
-
數(shù)據(jù)分片
最后,高并發(fā)系統(tǒng)的設(shè)計是一個負(fù)責(zé)且系統(tǒng)的工程,目標(biāo)絕不僅僅只關(guān)注性能,實際上要同時關(guān)注高可用和擴展性。所以在實際方案的設(shè)計中,除了要考慮正常情況下性能指標(biāo)是否能夠達(dá)成,還要考慮在各種異常情況下系統(tǒng)是否能處于可控的狀態(tài),如不能因為一個異常情況就發(fā)生系統(tǒng)雪崩,另外互聯(lián)網(wǎng)業(yè)務(wù)都是處于高速迭代和發(fā)展的過程,要保證未來的場景有足夠的演進空間。
如上,我們在日常工作和面試經(jīng)歷中并不一定能夠真實經(jīng)歷高并發(fā)系統(tǒng),但是我們依然有多種學(xué)習(xí)和實踐方式獲得類似經(jīng)驗。如果能夠嘗試去學(xué)習(xí)和理解高并發(fā)場景下的設(shè)計原則,以及可能遇到的問題場景和解法,等真正遇到高并發(fā)項目的時候,效果也是事半功倍。
希望以上分享對大家有所幫助。一起加油~


2024-10-16 12:48:42




