互聯網秒殺方案爲了解決超賣,目前流行兩種處理方式:1.隊列方式,全部請求放入隊列,後臺從隊列按照FIFO處理2.樂觀鎖方式。 php
具體方案以下: html
1.隊列方式,直接將請求放入隊列,採用FIFO(先進先出)方式處理。此方式強行將併發請求一一排序,解決了超賣問題。 nginx
缺點1:當高併發場景爆掉隊列的話,系統將陷入異常,搶購活動停止。 web
解決方案:1.加大隊列服務器內存 算法
2.事先可設置入隊最大個數,當超過次數,直接返回已售罄頁面(推薦) 瀏覽器
缺點2:用戶搶購後,沒法直觀看到最終搶購結果,須要等到隊列執行以後才能知道 服務器
解決方案:採用長鏈接通知用戶處理結果 併發
2.樂觀鎖,樂觀鎖機制大都採用版本號更新。具體實現是全部請求都有資格進行修改庫存,但每次修改前會得到一個該庫存數據版本,只有版本符號的請求才會修改爲功,不然,修改失敗。不過此方式會增大服務器CPU計算開銷 高併發
缺點:服務器CPU消耗大 網站
解決方案:提早預估搶購規模,準備服務器。隨時根據狀況增長
總結以後,我的更傾向第二種方案,同時爲了完善此方案,增長一下幾點:
1.提早預定,只有預定資格用戶可參加搶購
2.防止惡意搶購,增長動態驗證碼
3.搶購頁面靜態化,使用CDN
4.避免經過下單URL直接下單,使該URL動態化。下單頁面URL加入服務器隨機數作爲參數,只有秒殺開始時候才能獲得。
5.搶購經過定時任務自動開始,開始後可生成隨機下單參數
6.對時,瀏覽器可能和服務器時間不一致,js固定時間進行對時,保證時間一致性;web服務器對時,每隔一分鐘全部web服務器和對時服務器進行時間同步
nginx方面的一些設置
1.ngx_http_limit_conn_module 限制鏈接數模塊
一般用來限制同一IP地址的可併發鏈接數
相關文檔:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
注意:$binary_remote_addr而不是$remote_addr,$remote_addr的長度爲7到15個字節,它的會話信息的長度爲32或64 bytes,$binary_remote_addr的長度爲4字節,會話信息的長度爲32字節,這樣設置1M的一個zone時,用$binary_remote_addr方式,該zone將會存放32000個會話。
2.ngx_http_limit_req_module 限制請求數模塊
一般用來限制同一IP地址單位時間可完成的請求數,限制的方法是採用漏桶算法(Leaky Bucket),每秒處理固定請求數量,推遲過多請求,超過桶的閥值,請求直接終止返回503
相關文檔:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
3.基於nginx的Tengine分支ngx_http_limit_req_module
nginx相似,不過支持多個變量,而且支持多個limit_req_zone及forbid_action的設置。
相關文檔:http://tengine.taobao.org/document_cn/http_limit_req_cn.html
4.基於nginx的Senginx分支的ngx_http_limit_req_module
稱之爲基於條件的限速功能,在Tenginer的limit_req模塊基礎上,增長condition參數,在條件爲真時執行限制動做。
相關文檔:http://www.senginx.org/cn/index.php/%E5%9F%BA%E4%BA%8E%E6%9D%A1%E4%BB%B6%E7%9A%84%E9%99%90%E9%80%9F%E5%8A%9F%E8%83%BD
5.基於nginx的Senginx分支的ngx_http_ip_behavior
稱之爲行爲識別模塊,訪問行爲識別模塊的做用是對用戶訪問網站的行爲進行監控
相關文檔:http://www.senginx.org/cn/index.php/%E8%AE%BF%E9%97%AE%E8%A1%8C%E4%B8%BA%E8%AF%86%E5%88%AB%E6%A8%A1%E5%9D%97
6.基於nginx的Senginx分支的ngx_http_robot_mitigation
稱之爲HTTP機器人緩解,Robot Mitigation模塊採用了一種基於「挑戰」的驗證方法,即向客戶端發送特定的、瀏覽器能解析的應答,若是客戶端是真實的瀏覽器,則會從新觸發請求, 並帶有一個特定的Cookie值,Robot Mitigation模塊會依據此Cookie的信息來決定是否放行此請求。
相關文檔:http://www.senginx.org/cn/index.php/Robot_Mitigation%E6%A8%A1%E5%9D%97