當前位置: 妍妍網 > 碼農

如何設計一個秒殺系統?

2024-03-02碼農

秒殺是電商系統中常見的業務,用於吸引使用者,刺激留存及消費所做的一種活動。經典的秒殺包含限時秒殺和限量秒殺。很多公司有專門的秒殺系統。哪個業務要做活動,就來對接這個系統。

系統特點

1、瞬時流量極大,過了秒殺時間點流量結束。

2、秒殺商戶庫存極少,例如百萬使用者去搶2個iphone。

3、秒殺時間點沒到的時候,重新整理量大,靜態資源存取量劇增。

一般流程

事前:營運側建活動,並將秒殺數據、庫存等資訊寫入緩存。技術側預估資源等情況是否能支撐。

事中:秒殺快開始時,使用者可能會瘋狂重新整理。開始後使用者秒殺。

事後:履約。

對映到技術層面,有如下考慮點

1、高並行、快響應:除了秒殺開始後的流量激增,還要防止 機器人刷單、 頁面存取量大和 秒殺前防止請求打到後端。

2、防超賣。

3、訂單履約。

4、應急處理。

高並行、快響應

嚴格準入,比如手機驗證、真人驗證手段防止機器人刷單。

使用頁面靜態化、CDN加速、靜態資源緩存及壓縮對應 頁面存取量大。

秒殺按鈕置灰、秒殺真連結隱藏來防止 秒殺前請求打到後 端,同時也可以防止一些機器人、黃牛提前知道連結,使得真正的使用者搶不到 。還可以針對同一使用者、同一IP做限流,比如10QPS,這已經基本不是人可以做到的手速了。

對於 秒殺開始後的流量激增,首先要做好壓測,找出薄弱點進行程式碼最佳化、服務支撐最佳化。如果公司支持彈性擴縮,要提前測試。如果公司不支持,容量要提前擴容到位並壓測。

防超賣

技術上一般采用redis+熱數據緩存+MQ。庫存一般會在秒殺前同步到redis中。秒殺時判斷庫存是否充足,充足則可進行扣減。可以借助Redis+lua指令碼來保證原子性,防止數據不準確造成超賣。

訂單履約

秒殺可以采用兩階段處理,第一階段如果秒殺成功,則將這個訊息放入訊息佇列來做履約。這樣可以提高響應速度,也可以減少秒殺並行的壓力。這個訊息要做成可靠訊息,如果消費失敗,需要有重試。重試失敗則需要持久化到資料庫等方式保存,定時掃描重新處理。同時要有告警機制,確保成功。

應急處理

要有降級開關來保證確實出了問題的情況下及時止損。