來自我的博客 秒殺活動的設計
html 等靜態文件上CDN ,這方面壓力不大
後臺程序動態接口,必須支持高併發,用戶體驗必須作好
後端程序優化點(歡迎你們補充)php
// 後臺進程消費隊列 我的使用brpoplpush方法 取出數據並用存入另外隊列做數據備份 $block_expire_time = 0; # 設置阻塞等待時間爲永久 $redis->brpoplpush($key, $backup_key, $block_expire_time);
$lock_status = $redis->set($lock_key, 1, array("NX", "EX"=>$expire_time));
我的設計的方案:提早把每一個獎品放入 redis隊列,每一個key一個獎品,隊列的長度是獎品的數量,能夠保證獎品不會超發放
另外,假設使用
悲觀鎖,在更新數據的時候加鎖,其它的都爲等待狀態,不合適秒殺場景
樂觀鎖 基本是採用帶版本號更新,版本號匹配才能更新,其它的回滾,雖然保證的數據的安全不超發放,可是在高併發場景下,DB只有兩臺的時候,超過mysql 進程堆積確定會的, 超過最大鏈接數是怎麼辦,一系列的問題須要解決,因此該方案不合適html
在平均響應時間300ms內,單臺qps 750 左右(保持300ms是公司壓測試的規範指標)
10臺機器(後面新增2臺到 8+2)一秒鐘能處理: 10 * 750 = 7500
保守的併發只有7500,與10w 差距大,須要在執行方案上解決,公司不可無限的申請web機器。
解決10W併發問題(資源有限的狀況)方案
在代理層作處理,根據權重擋掉93%的量,返回800(自定義),前端判斷是否爲800,是則提示火爆用戶重試(對應的方案設置友好一些)前端