秒殺是電商系統中常見的業務,用於吸引使用者,刺激留存及消費所做的一種活動。經典的秒殺包含限時秒殺和限量秒殺。很多公司有專門的秒殺系統。哪個業務要做活動,就來對接這個系統。
系統特點
1、瞬時流量極大,過了秒殺時間點流量結束。
2、秒殺商戶庫存極少,例如百萬使用者去搶2個iphone。
3、秒殺時間點沒到的時候,重新整理量大,靜態資源存取量劇增。
一般流程
事前:營運側建活動,並將秒殺數據、庫存等資訊寫入緩存。技術側預估資源等情況是否能支撐。
事中:秒殺快開始時,使用者可能會瘋狂重新整理。開始後使用者秒殺。
事後:履約。
對映到技術層面,有如下考慮點
1、高並行、快響應:除了秒殺開始後的流量激增,還要防止 機器人刷單、 頁面存取量大和 秒殺前防止請求打到後端。
2、防超賣。
3、訂單履約。
4、應急處理。
高並行、快響應
嚴格準入,比如手機驗證、真人驗證手段防止機器人刷單。
使用頁面靜態化、CDN加速、靜態資源緩存及壓縮對應 頁面存取量大。
秒殺按鈕置灰、秒殺真連結隱藏來防止 秒殺前請求打到後 端,同時也可以防止一些機器人、黃牛提前知道連結,使得真正的使用者搶不到 。還可以針對同一使用者、同一IP做限流,比如10QPS,這已經基本不是人可以做到的手速了。
對於 秒殺開始後的流量激增,首先要做好壓測,找出薄弱點進行程式碼最佳化、服務支撐最佳化。如果公司支持彈性擴縮,要提前測試。如果公司不支持,容量要提前擴容到位並壓測。
防超賣
技術上一般采用redis+熱數據緩存+MQ。庫存一般會在秒殺前同步到redis中。秒殺時判斷庫存是否充足,充足則可進行扣減。可以借助Redis+lua指令碼來保證原子性,防止數據不準確造成超賣。
訂單履約
秒殺可以采用兩階段處理,第一階段如果秒殺成功,則將這個訊息放入訊息佇列來做履約。這樣可以提高響應速度,也可以減少秒殺並行的壓力。這個訊息要做成可靠訊息,如果消費失敗,需要有重試。重試失敗則需要持久化到資料庫等方式保存,定時掃描重新處理。同時要有告警機制,確保成功。
應急處理
要有降級開關來保證確實出了問題的情況下及時止損。