經典面試題,如何設計一個秒殺系統

說起秒殺,從雙十一購物到春節搶紅包,再到逢年過節搶?票,「秒殺」的場景在我們的生活中處處可?。簡單來說,秒殺就是在同一個時刻有大量的請求,爭搶購買同一個商品並完成交易的過程。

不管校招,還是社招,如何設計一個秒殺系統的面試題經常出現,如果懂得其中原理,就可以對答如流,不過涉及到一些瓶頸優化,有些同學就未必都能答出。

面試官:簡單說一下秒殺系統的設計思路?
這種題目,小菜是準備過的,巴拉巴拉的說了一堆。
面試官:那這裡是怎麼保證秒殺成功的?
小菜:&8^%#
面試官:你這裡用了Redis,有什麼用?
小菜:#¥&……%
面試官:你用什麼測試過這個系統的並發量?
小菜:&*%$^&.
面試官:你覺得你這個系統還可以再優化么?
小菜:&%……¥)
面試官:你知道這個系統的瓶頸在哪裡嗎?如果流量再大10倍,怎麼應對?
小菜:88!

秒殺系統的整體架構可以概括為「穩、准、快」。

整個系統架構要滿足高可用,流量符合預期時肯定要穩定,超出預期時也同樣不能掉鏈子,你要保證秒殺活動順利完成,即秒殺商品順利地賣出去,這個是最基本的前提。

你的業務需求是秒殺10台iPhone XS,那就只能成交10台,多一台少一台都不行。一旦庫存不對,那平台就要承擔損失。

就是說系統的性能要足夠高,否則你怎麼支撐這麼大的流量呢?不光是服務端要做極致的性能優化,而且在整個請求鏈路上都要做協同的優化,每個地方快一點,整個系統就完美了。

設計思路:將請求攔截在系統上游,降低下游壓力。在一個並發量大,實際需求小的系統中,應當盡量在前端攔截無效流量,降低下游伺服器和資料庫的壓力,不然很可能造成資料庫讀寫鎖衝突,甚至導致死鎖,最終請求超時。

限流:

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

削峰:

瞬時大流量峰值容易壓垮系統,解決這個問題是重中之重。常用的消峰方法有非同步處理、緩存和消息中間件等技術。

非同步處理:

秒殺系統是一個高並發系統,採用非同步處理模式可以極大地提高系統並發量,其實非同步處理就是削峰的一種實現方式。

內存緩存:

秒殺系統最大的瓶頸一般都是資料庫讀寫,由於資料庫讀寫屬於磁碟IO,性能很低,如果能夠把部分數據或業務邏輯轉移到內存緩存,效率會有極大地提升。

消息隊列:

消息隊列可以削峰,將攔截大量並發請求,這也是一個非同步處理過程,後台業務根據自己的處理能力,從消息隊列中主動的拉取請求消息進行業務處理。

可拓展:

當然如果我們想支持更多用戶,更大的並發,最好就將系統設計成彈性可拓展的,如果流量來了,拓展機器就好了,像淘寶、京東等雙十一活動時會臨時增加大量機器應對交易高峰。

最後,更多關於秒殺系統的解決方案,推薦一個專欄.

  • 如何才能做好動靜分離?有哪些方案可選?

  • 如何理解QPS、響應時間和線程數之間的關係?

  • 如何有針對性地處理好系統的「熱點數據」?

  • 秒殺減庫存的方案應該如何設計?

專欄只要九塊九,

9.9 買不了吃虧(吃虧就殺死佔小狼)

9.9 買不了上當(上當就殺死佔小狼)

9.9 就可以帶回家(把佔小狼帶回家)


推薦閱讀:

PC瞬間變平板 Windows也能運行安卓系統
(1)[轉載]老子《德道經》第一章系統落地解讀
董子的思想系統及其當代啟示意義
我收集的blog系統-king

TAG:設計 | 經典 | 面試 | 系統 | 秒殺 |