Java面試,如何設(shè)計(jì)一個(gè)秒殺系統(tǒng)

說(shuō)起秒殺,我想你肯定不陌生,從雙十一購(gòu)物到春節(jié)搶紅包,再到逢年過(guò)節(jié)搶?票,“秒殺”的場(chǎng)景在我們的生活中處處可?。簡(jiǎn)單來(lái)說(shuō),秒殺就是在同一個(gè)時(shí)刻有大量的請(qǐng)求,爭(zhēng)搶購(gòu)買(mǎi)同一個(gè)商品并完成交易的過(guò)程。

不管校招,還是社招,如何設(shè)計(jì)一個(gè)秒殺系統(tǒng)的面試題經(jīng)常出現(xiàn),如果懂得其中原理,就可以對(duì)答如流,不過(guò)涉及到一些瓶頸優(yōu)化,有些同學(xué)就未必都能答出。

面試官:簡(jiǎn)單說(shuō)一下秒殺系統(tǒng)的設(shè)計(jì)思路?
這種題目,小菜是準(zhǔn)備過(guò)的,巴拉巴拉的說(shuō)了一堆。
面試官:那這里是怎么保證秒殺成功的?
小菜:&8^%#
面試官:你這里用了Redis,有什么用?
小菜:#¥
&……%
面試官:你用什么測(cè)試過(guò)這個(gè)系統(tǒng)的并發(fā)量?
小菜:&*%$^&.
面試官:你覺(jué)得你這個(gè)系統(tǒng)還可以再優(yōu)化么?
小菜:&%……¥)
面試官:你知道這個(gè)系統(tǒng)的瓶頸在哪里嗎?如果流量再大10倍,怎么應(yīng)對(duì)?
小菜:88!

秒殺系統(tǒng)的整體架構(gòu)可以概括為“穩(wěn)、準(zhǔn)、快”幾個(gè)關(guān)鍵字。

所謂“穩(wěn)”,就是整個(gè)系統(tǒng)架構(gòu)要滿足高可用,流量符合預(yù)期時(shí)肯定要穩(wěn)定,超出預(yù)期時(shí)也同樣不能掉鏈子,你要保證秒殺活動(dòng)順利完成,即秒殺商品順利地賣(mài)出去,這個(gè)是最基本的前提。

然后就是“準(zhǔn)”,你的業(yè)務(wù)需求是秒殺10臺(tái)iPhone XS,那就只能成交10臺(tái),多一臺(tái)少一臺(tái)都不行。一旦庫(kù)存不對(duì),那平臺(tái)就要承擔(dān)損失,所以“準(zhǔn)”就是要求保證數(shù)據(jù)的一致性。

最后再看“快”,“快”其實(shí)很好理解,它就是說(shuō)系統(tǒng)的性能要足夠高,否則你怎么支撐這么大的流量呢?不光是服務(wù)端要做極致的性能優(yōu)化,而且在整個(gè)請(qǐng)求鏈路上都要做協(xié)同的優(yōu)化,每個(gè)地方快一點(diǎn),整個(gè)系統(tǒng)就完美了。

所以,一般優(yōu)化設(shè)計(jì)思路:將請(qǐng)求攔截在系統(tǒng)上游,降低下游壓力。
在一個(gè)并發(fā)量大,實(shí)際需求小的系統(tǒng)中,應(yīng)當(dāng)盡量在前端攔截?zé)o效流量,降低下游服務(wù)器和數(shù)據(jù)庫(kù)的壓力,不然很可能造成數(shù)據(jù)庫(kù)讀寫(xiě)鎖沖突,甚至導(dǎo)致死鎖,最終請(qǐng)求超時(shí)。

限流:前端直接限流,允許少部分流量流向后端。

削峰:瞬時(shí)大流量峰值容易壓垮系統(tǒng),解決這個(gè)問(wèn)題是重中之重。常用的消峰方法有異步處理、緩存和消息中間件等技術(shù)。

異步處理:秒殺系統(tǒng)是一個(gè)高并發(fā)系統(tǒng),采用異步處理模式可以極大地提高系統(tǒng)并發(fā)量,其實(shí)異步處理就是削峰的一種實(shí)現(xiàn)方式。

內(nèi)存緩存:秒殺系統(tǒng)最大的瓶頸一般都是數(shù)據(jù)庫(kù)讀寫(xiě),由于數(shù)據(jù)庫(kù)讀寫(xiě)屬于磁盤(pán)IO,性能很低,如果能夠把部分?jǐn)?shù)據(jù)或業(yè)務(wù)邏輯轉(zhuǎn)移到內(nèi)存緩存,效率會(huì)有極大地提升。

消息隊(duì)列:消息隊(duì)列可以削峰,將攔截大量并發(fā)請(qǐng)求,這也是一個(gè)異步處理過(guò)程,后臺(tái)業(yè)務(wù)根據(jù)自己的處理能力,從消息隊(duì)列中主動(dòng)的拉取請(qǐng)求消息進(jìn)行業(yè)務(wù)處理。

可拓展:當(dāng)然如果我們想支持更多用戶,更大的并發(fā),最好就將系統(tǒng)設(shè)計(jì)成彈性可拓展的,如果流量來(lái)了,拓展機(jī)器就好了,像淘寶、京東等雙十一活動(dòng)時(shí)會(huì)臨時(shí)增加大量機(jī)器應(yīng)對(duì)交易高峰。

最后,更多關(guān)于秒殺系統(tǒng)的解決方案,推薦一個(gè)專(zhuān)欄.

  • 如何才能做好動(dòng)靜分離?有哪些方案可選?
  • 如何理解QPS、響應(yīng)時(shí)間和線程數(shù)之間的關(guān)系?
  • 如何有針對(duì)性地處理好系統(tǒng)的“熱點(diǎn)數(shù)據(jù)”?
  • 秒殺減庫(kù)存的方案應(yīng)該如何設(shè)計(jì)?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,265評(píng)論 8 265
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,232評(píng)論 25 708
  • sass compass安裝 ##ddddd## 安裝rubyinstaller(http://rubyinsta...
    gtmc閱讀 275評(píng)論 0 0
  • 感冒打不了球,就在車(chē)上把書(shū)給看了。路燈亮,文字很清晰。突然就想起小時(shí)候鉆被窩打手電看書(shū)的情景。雖然畫(huà)面已記不清晰了...
    人生修行閱讀 203評(píng)論 0 0
  • 肜旻,什么鬼?今天的題目有點(diǎn)標(biāo)題黨嫌疑哈。但看見(jiàn)這倆字的人,大概就知道一個(gè)字:暈! 肜旻,拼音加注為róngmín...
    亞理思多得閱讀 955評(píng)論 0 0

友情鏈接更多精彩內(nèi)容