【面試題】如何設(shè)計(jì)一個(gè)高并發(fā)的系統(tǒng)?
時(shí)間:2021-11-03 14:16:19
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]每個(gè)行業(yè)都一樣,人才都是分層次的,從事技術(shù)行業(yè)的程序員們更是如此,按照技術(shù)能力分為三六九等。每個(gè)層次的人出去面試,面試官考察的方向是不一樣的。剛?cè)肼殘?chǎng)的小白,會(huì)問(wèn)你很多基礎(chǔ)性的知識(shí),有過(guò)幾年經(jīng)驗(yàn)的程序員,會(huì)問(wèn)你相關(guān)的項(xiàng)目經(jīng)歷、架構(gòu)設(shè)計(jì)。如果是行業(yè)有影響力的技術(shù)專家,不一定會(huì)問(wèn)你技...
每個(gè)行業(yè)都一樣,人才都是分層次的,從事技術(shù)行業(yè)的程序員們更是如此,按照技術(shù)能力分為三六九等。
每個(gè)層次的人出去面試,面試官考察的方向是不一樣的。
剛?cè)肼殘?chǎng)的小白,會(huì)問(wèn)你很多基礎(chǔ)性的知識(shí),有過(guò)幾年經(jīng)驗(yàn)的程序員,會(huì)問(wèn)你相關(guān)的項(xiàng)目經(jīng)歷、架構(gòu)設(shè)計(jì)。如果是行業(yè)有影響力的技術(shù)專家,不一定會(huì)問(wèn)你技術(shù),可能就跟你聊聊行業(yè)動(dòng)態(tài)、技術(shù)發(fā)展趨勢(shì)。
如果你出去面試,面試官問(wèn)你,如何設(shè)計(jì)一個(gè)高并發(fā)的系統(tǒng)?
那么你就得好好回答了,為什么?
如果你確實(shí)在互聯(lián)網(wǎng)公司干過(guò)高并發(fā)系統(tǒng),經(jīng)歷過(guò)每天幾億幾十億的流量,高峰期每秒幾萬(wàn)甚至幾十萬(wàn)的并發(fā)的話,面試官肯定不會(huì)問(wèn)你如何設(shè)計(jì)一個(gè)高并發(fā)系統(tǒng)。而是會(huì)讓你介紹下你們的項(xiàng)目,你們項(xiàng)目架構(gòu)是什么樣的?怎么部署的?部署了多少臺(tái)機(jī)器?緩存怎么用的?數(shù)據(jù)庫(kù)怎么用的?就是深挖細(xì)節(jié),你到底是如何抗下高并發(fā)的。
如果面試官問(wèn)你如何設(shè)計(jì)一個(gè)高并發(fā)系統(tǒng),一定是你沒(méi)實(shí)際干過(guò)高并發(fā)系統(tǒng)。面試官看你簡(jiǎn)歷沒(méi)什么亮點(diǎn),又有幾年工作經(jīng)驗(yàn),所以給你一個(gè)開(kāi)放式的設(shè)計(jì)題,通過(guò)這個(gè)題目,了解你雖然沒(méi)有實(shí)際干過(guò)高并發(fā)系統(tǒng),但有沒(méi)有自己研究學(xué)習(xí)過(guò),有沒(méi)有相關(guān)的知識(shí)積累。
面試官當(dāng)然是希望招個(gè)真正干過(guò)高并發(fā)的人了,但這種人很難招,所以只能退而求其次,招一個(gè)沒(méi)有實(shí)際經(jīng)驗(yàn)但有相關(guān)知識(shí)積累的人。
所以此時(shí),你必須展示出你所有關(guān)于高并發(fā)的知識(shí)了!
這種問(wèn)題呢,最好不要一上來(lái)就給出最終的一套完備的高并發(fā)系統(tǒng)架構(gòu),而是不斷地演進(jìn),正常的系統(tǒng)架構(gòu)升級(jí)也是這么個(gè)過(guò)程。
比如,最開(kāi)始時(shí)每秒最多10個(gè)請(qǐng)求,一個(gè)單體系統(tǒng)就可以抗住。
圖1?單體系統(tǒng)
接下來(lái)10w個(gè)用戶變成100w,1000w個(gè)用戶,每秒1000個(gè)請(qǐng)求,你線上機(jī)器內(nèi)存開(kāi)始開(kāi)始感覺(jué)到緊張,使用率開(kāi)始上升,cup使用率飆升。你數(shù)據(jù)庫(kù)可能就扛不住了,因?yàn)閿?shù)據(jù)庫(kù)磁盤(pán)io效率開(kāi)始下降,很多SQL變得很慢。
這個(gè)時(shí)候你要干的第一件事情就是系統(tǒng)拆分,把之前的單體系統(tǒng)拆分成多個(gè)系統(tǒng),數(shù)據(jù)庫(kù)也跟隨系統(tǒng)做拆分,每個(gè)系統(tǒng)使用自己的數(shù)據(jù)庫(kù)。
圖2?系統(tǒng)拆分
單體系統(tǒng)拆分成立3個(gè)系統(tǒng),每個(gè)系統(tǒng)訪問(wèn)自己獨(dú)立的數(shù)據(jù)庫(kù),每個(gè)數(shù)據(jù)庫(kù)部署在獨(dú)立的機(jī)器上。原來(lái)一個(gè)數(shù)據(jù)庫(kù)最多可以抗1000的并發(fā),現(xiàn)在所有的資源翻了三倍,可以抗3000的并發(fā)。
假設(shè)現(xiàn)在系統(tǒng)每秒又3000個(gè)請(qǐng)求了,你系統(tǒng)可能又快扛不住了,這時(shí)候你怎么辦呢?用緩存。
redis緩存可以輕松的抗幾萬(wàn)的并發(fā),用緩存后呢,大量的讀請(qǐng)求可以走緩存,很多系統(tǒng)都是讀多寫(xiě)少,比如資訊系統(tǒng),3000個(gè)并發(fā)請(qǐng)求,緩存至少攔截掉2000個(gè)讀請(qǐng)求,剩下1000個(gè)寫(xiě)請(qǐng)求走數(shù)據(jù)庫(kù)。
圖3?增加緩存
假設(shè)現(xiàn)在用戶增長(zhǎng)到1億用戶,每秒鐘1w請(qǐng)求,寫(xiě)請(qǐng)求達(dá)到2000個(gè),數(shù)據(jù)庫(kù)又扛不住了,怎么辦呢,可以在數(shù)據(jù)庫(kù)前面加個(gè)MQ。
圖4?增加MQ
這里MQ主要起到削峰的作用,高峰期大量的寫(xiě)請(qǐng)求積壓在MQ中,等高峰期過(guò)了,再慢慢消費(fèi)。
接下來(lái)用戶增長(zhǎng)到2億,每秒2w個(gè)請(qǐng)求,4000個(gè)寫(xiě)請(qǐng)求。MQ就會(huì)積壓非常多的消息,導(dǎo)致很多數(shù)據(jù)很久都不能被修改掉,這是用戶不能忍受的。
單庫(kù)寫(xiě)已經(jīng)達(dá)到瓶頸了,怎么辦,分庫(kù)分表啊。你可以把一臺(tái)數(shù)據(jù)庫(kù)拆分為3臺(tái)數(shù)據(jù)庫(kù),用多個(gè)數(shù)據(jù)庫(kù)分?jǐn)倢?xiě)請(qǐng)求壓力。圖5 分庫(kù)分表
緩存有過(guò)期的可能,如果請(qǐng)求訪問(wèn)的時(shí)候,緩存剛好過(guò)期了,就會(huì)導(dǎo)致讀請(qǐng)求直接穿透到數(shù)據(jù)庫(kù)里,所以你還可以給數(shù)據(jù)庫(kù)加上讀寫(xiě)分離,讓讀請(qǐng)求分流到從庫(kù)去,降低對(duì)主庫(kù)的壓力。
圖6 讀寫(xiě)分離
針對(duì)搜索的話,數(shù)據(jù)量小的時(shí)候,可以走數(shù)據(jù)庫(kù),當(dāng)數(shù)據(jù)量大了后,可以把相關(guān)的數(shù)據(jù)抽出來(lái)放到es集群里,es集群專門(mén)提供查詢服務(wù)。
es集群是分布式的,可以放幾十億的數(shù)據(jù),可以針對(duì)系統(tǒng)的數(shù)據(jù)量和搜索并發(fā),配置合適數(shù)量的機(jī)器。
圖7 es搜索
總之,就是隨著用戶量和并發(fā)量的不斷增長(zhǎng),系統(tǒng)的架構(gòu)也在不斷地演進(jìn)。上面這種架構(gòu)演進(jìn)還是比較簡(jiǎn)單的,真正復(fù)雜業(yè)務(wù)系統(tǒng)里,并不是簡(jiǎn)單的堆一些高大上的技術(shù)或框架,其系統(tǒng)遠(yuǎn)遠(yuǎn)比上面的系統(tǒng)復(fù)雜幾十倍。
如果面試的時(shí)候,面試官問(wèn)你如何設(shè)計(jì)一個(gè)高并發(fā)系統(tǒng),你可以按照上面這個(gè)思路回答。雖然你可能沒(méi)經(jīng)歷過(guò)高并發(fā)系統(tǒng),但本文如果能讓大家對(duì)這個(gè)問(wèn)題多一些思考,在面試的時(shí)候,有一些系統(tǒng)性的思路和闡述,那么也就達(dá)到本文的目的了。
每個(gè)層次的人出去面試,面試官考察的方向是不一樣的。
剛?cè)肼殘?chǎng)的小白,會(huì)問(wèn)你很多基礎(chǔ)性的知識(shí),有過(guò)幾年經(jīng)驗(yàn)的程序員,會(huì)問(wèn)你相關(guān)的項(xiàng)目經(jīng)歷、架構(gòu)設(shè)計(jì)。如果是行業(yè)有影響力的技術(shù)專家,不一定會(huì)問(wèn)你技術(shù),可能就跟你聊聊行業(yè)動(dòng)態(tài)、技術(shù)發(fā)展趨勢(shì)。
如果你出去面試,面試官問(wèn)你,如何設(shè)計(jì)一個(gè)高并發(fā)的系統(tǒng)?
那么你就得好好回答了,為什么?
如果你確實(shí)在互聯(lián)網(wǎng)公司干過(guò)高并發(fā)系統(tǒng),經(jīng)歷過(guò)每天幾億幾十億的流量,高峰期每秒幾萬(wàn)甚至幾十萬(wàn)的并發(fā)的話,面試官肯定不會(huì)問(wèn)你如何設(shè)計(jì)一個(gè)高并發(fā)系統(tǒng)。而是會(huì)讓你介紹下你們的項(xiàng)目,你們項(xiàng)目架構(gòu)是什么樣的?怎么部署的?部署了多少臺(tái)機(jī)器?緩存怎么用的?數(shù)據(jù)庫(kù)怎么用的?就是深挖細(xì)節(jié),你到底是如何抗下高并發(fā)的。
如果面試官問(wèn)你如何設(shè)計(jì)一個(gè)高并發(fā)系統(tǒng),一定是你沒(méi)實(shí)際干過(guò)高并發(fā)系統(tǒng)。面試官看你簡(jiǎn)歷沒(méi)什么亮點(diǎn),又有幾年工作經(jīng)驗(yàn),所以給你一個(gè)開(kāi)放式的設(shè)計(jì)題,通過(guò)這個(gè)題目,了解你雖然沒(méi)有實(shí)際干過(guò)高并發(fā)系統(tǒng),但有沒(méi)有自己研究學(xué)習(xí)過(guò),有沒(méi)有相關(guān)的知識(shí)積累。
面試官當(dāng)然是希望招個(gè)真正干過(guò)高并發(fā)的人了,但這種人很難招,所以只能退而求其次,招一個(gè)沒(méi)有實(shí)際經(jīng)驗(yàn)但有相關(guān)知識(shí)積累的人。
所以此時(shí),你必須展示出你所有關(guān)于高并發(fā)的知識(shí)了!
這種問(wèn)題呢,最好不要一上來(lái)就給出最終的一套完備的高并發(fā)系統(tǒng)架構(gòu),而是不斷地演進(jìn),正常的系統(tǒng)架構(gòu)升級(jí)也是這么個(gè)過(guò)程。
比如,最開(kāi)始時(shí)每秒最多10個(gè)請(qǐng)求,一個(gè)單體系統(tǒng)就可以抗住。
圖1?單體系統(tǒng)
接下來(lái)10w個(gè)用戶變成100w,1000w個(gè)用戶,每秒1000個(gè)請(qǐng)求,你線上機(jī)器內(nèi)存開(kāi)始開(kāi)始感覺(jué)到緊張,使用率開(kāi)始上升,cup使用率飆升。你數(shù)據(jù)庫(kù)可能就扛不住了,因?yàn)閿?shù)據(jù)庫(kù)磁盤(pán)io效率開(kāi)始下降,很多SQL變得很慢。
這個(gè)時(shí)候你要干的第一件事情就是系統(tǒng)拆分,把之前的單體系統(tǒng)拆分成多個(gè)系統(tǒng),數(shù)據(jù)庫(kù)也跟隨系統(tǒng)做拆分,每個(gè)系統(tǒng)使用自己的數(shù)據(jù)庫(kù)。
圖2?系統(tǒng)拆分
單體系統(tǒng)拆分成立3個(gè)系統(tǒng),每個(gè)系統(tǒng)訪問(wèn)自己獨(dú)立的數(shù)據(jù)庫(kù),每個(gè)數(shù)據(jù)庫(kù)部署在獨(dú)立的機(jī)器上。原來(lái)一個(gè)數(shù)據(jù)庫(kù)最多可以抗1000的并發(fā),現(xiàn)在所有的資源翻了三倍,可以抗3000的并發(fā)。
假設(shè)現(xiàn)在系統(tǒng)每秒又3000個(gè)請(qǐng)求了,你系統(tǒng)可能又快扛不住了,這時(shí)候你怎么辦呢?用緩存。
redis緩存可以輕松的抗幾萬(wàn)的并發(fā),用緩存后呢,大量的讀請(qǐng)求可以走緩存,很多系統(tǒng)都是讀多寫(xiě)少,比如資訊系統(tǒng),3000個(gè)并發(fā)請(qǐng)求,緩存至少攔截掉2000個(gè)讀請(qǐng)求,剩下1000個(gè)寫(xiě)請(qǐng)求走數(shù)據(jù)庫(kù)。
圖3?增加緩存
假設(shè)現(xiàn)在用戶增長(zhǎng)到1億用戶,每秒鐘1w請(qǐng)求,寫(xiě)請(qǐng)求達(dá)到2000個(gè),數(shù)據(jù)庫(kù)又扛不住了,怎么辦呢,可以在數(shù)據(jù)庫(kù)前面加個(gè)MQ。
圖4?增加MQ
這里MQ主要起到削峰的作用,高峰期大量的寫(xiě)請(qǐng)求積壓在MQ中,等高峰期過(guò)了,再慢慢消費(fèi)。
接下來(lái)用戶增長(zhǎng)到2億,每秒2w個(gè)請(qǐng)求,4000個(gè)寫(xiě)請(qǐng)求。MQ就會(huì)積壓非常多的消息,導(dǎo)致很多數(shù)據(jù)很久都不能被修改掉,這是用戶不能忍受的。
單庫(kù)寫(xiě)已經(jīng)達(dá)到瓶頸了,怎么辦,分庫(kù)分表啊。你可以把一臺(tái)數(shù)據(jù)庫(kù)拆分為3臺(tái)數(shù)據(jù)庫(kù),用多個(gè)數(shù)據(jù)庫(kù)分?jǐn)倢?xiě)請(qǐng)求壓力。圖5 分庫(kù)分表
緩存有過(guò)期的可能,如果請(qǐng)求訪問(wèn)的時(shí)候,緩存剛好過(guò)期了,就會(huì)導(dǎo)致讀請(qǐng)求直接穿透到數(shù)據(jù)庫(kù)里,所以你還可以給數(shù)據(jù)庫(kù)加上讀寫(xiě)分離,讓讀請(qǐng)求分流到從庫(kù)去,降低對(duì)主庫(kù)的壓力。
圖6 讀寫(xiě)分離
針對(duì)搜索的話,數(shù)據(jù)量小的時(shí)候,可以走數(shù)據(jù)庫(kù),當(dāng)數(shù)據(jù)量大了后,可以把相關(guān)的數(shù)據(jù)抽出來(lái)放到es集群里,es集群專門(mén)提供查詢服務(wù)。
es集群是分布式的,可以放幾十億的數(shù)據(jù),可以針對(duì)系統(tǒng)的數(shù)據(jù)量和搜索并發(fā),配置合適數(shù)量的機(jī)器。
圖7 es搜索
總之,就是隨著用戶量和并發(fā)量的不斷增長(zhǎng),系統(tǒng)的架構(gòu)也在不斷地演進(jìn)。上面這種架構(gòu)演進(jìn)還是比較簡(jiǎn)單的,真正復(fù)雜業(yè)務(wù)系統(tǒng)里,并不是簡(jiǎn)單的堆一些高大上的技術(shù)或框架,其系統(tǒng)遠(yuǎn)遠(yuǎn)比上面的系統(tǒng)復(fù)雜幾十倍。
如果面試的時(shí)候,面試官問(wèn)你如何設(shè)計(jì)一個(gè)高并發(fā)系統(tǒng),你可以按照上面這個(gè)思路回答。雖然你可能沒(méi)經(jīng)歷過(guò)高并發(fā)系統(tǒng),但本文如果能讓大家對(duì)這個(gè)問(wèn)題多一些思考,在面試的時(shí)候,有一些系統(tǒng)性的思路和闡述,那么也就達(dá)到本文的目的了。