「雙十一」零點、搶購茅台、搶高鐵票——這類場景將 Web 系統推向極限:瞬間湧入數萬 QPS,數據庫連接耗盡、緩存擊穿、請求堆積引發雪崩。本文從請求接口設計、性能極致優化、作弊攻防、數據安全四大維度,拆解秒殺系統架構核心難題與成熟解決方案,並揭秘「為什麼你永遠搶不到火車票」的技術真相。
理論峰值 QPS = Web服務器數 × MaxClients / 平均響應時間。
例:20 台 Apache × 500 連接 / 0.1s = 100,000 QPS。
但高並發下響應時間從 100ms 飆升至 250ms → 峰值驟降至 40,000 QPS,面對 50,000 QPS 請求,**10,000 請求無連接可用** → 請求堆積 → 響應時間進一步變長 → 可用連接更少 → **雪崩**。

| 攻擊手段 | 特徵 | 防禦策略 |
|---|---|---|
| 同一賬號高頻請求 | 插件/腳本發送百次請求,繞過邏輯判斷 (查庫無記錄 → 重複寫入) | **入口單請求限流**:Redis SETNX user:lock:{uid} 樂觀鎖,僅首個請求成功,其餘直接返回「操作太頻繁」 |
| 僵屍賬號群 (批量註冊) | 幾萬連號/同號段賬號,低等級、資料不全、低活躍 | **IP 維度限流**:單 IP 秒級請求超閾值 → 驗證碼/封禁。**賬號畫像清洗**:等級、實名、歷史行為、設備指紋多維評分,低分禁止參與 |
| 代理 IP 池 / 僵屍網絡 | 真實住宅 IP 轉發,行為極像真用戶 | **業務門檻提高**:實名、保證金、會員等級。**行為序列挖掘**:請求間隔分佈、鼠標軌跡、點擊熱力圖識別腳本特徵 |
| 驗證碼破解 (打碼平台/真人眾包) | 圖片轉發 → 真人識別 → 回填,毫秒級 | **行為驗證碼 (滑塊/點選/語序)** + **設備指紋綁定**,提高破解成本至不可接受 |

鐵路部門對策:風控模型識別「高頻退票、節假日異常活躍、設備指紋聚集」賬號,納入黑名單/人工審核;驗證碼升級為行為驗證;法律打擊打碼平台。
庫存 100 → 剩 1 → 並發請求讀到 99 → 全部通過判斷 → 扣減為 -1。**經典「查詢-判斷-更新」非原子操作競態條件。**

| 方案 | 原理 | 優點 | 缺點 | 適用性 |
|---|---|---|---|---|
| 悲觀鎖 (DB 行鎖) | SELECT ... FOR UPDATE 串行化 | 強一致性,簡單 | **高並發下鎖等待 → 連接池耗盡 → 雪崩** | ❌ 禁用於秒殺核心鏈路 |
| FIFO 隊列串行化 | 請求入隊,單消費者順序處理 | 無鎖等待,公平 | **隊列積壓 → 內存 OOM / 響應時間不可控** | ❌ 不適合高並發 |
| 樂觀鎖 (Redis WATCH / CAS) | WATCH stock → GET → MULTI → DECR → EXEC 版本號檢查 | **無鎖、高併發、失敗快速返回、CPU 開銷可控** | 極端熱點 Key 重試率高 (可用 Lua 腳本原子化解決) | ✅ 生產首選 |
-- KEYS[1]=stock_key, ARGV[1]=requested_qty
local stock = tonumber(redis.call('GET', KEYS[1]))
if stock >= tonumber(ARGV[1]) then
redis.call('DECRBY', KEYS[1], ARGV[1])
return 1 -- 成功
else
return 0 -- 庫存不足
end
優勢:單線程執行,天然原子,無網絡往返,無樂觀鎖重試開銷,QPS 可達 10 萬+。
秒殺無銀彈,唯有「極簡接口、內存級存儲、原子化操作、分層風控、全鏈路觀測」系統性工程,才能在流量洪峰中守住可用性與數據正確性。