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






