天天看點

如何實作“秒殺”系統

昨晚和一公司工作幾年的同僚閑扯了一些程式人生和技術問題。感覺自己目前的經驗還是太少太少了,看的書也不是太多,慚愧啊。

就比如同僚問了我一個如何做一個我們很常見的“秒殺”系統,我當時一拍腦門直接回答說加個排它鎖不就行了麼,但是晚上回到家裡google了一番之後,深深的感到臉紅啊。一個看似簡單的“秒殺”系統,裡面涉及到的東西也着實不少,而不僅僅是一個簡單的加鎖就行了的。我大緻整理了一下我想到的和google到的需要注意的地方,當然有很多的不足,同時也希望大神們能夠指點一點:

1) 對現有網站業務的沖擊

因為秒殺活動隻是網站營銷的一個附加活動,這個活動具有時間短,并發通路量大的特點,如果和網站原有應用部署在一起,必然會對現有業務造成沖擊,稍有不慎可能導緻整個網站癱瘓。

2) 高并發情況以及資料庫的負載

使用者在秒殺開始前,通過不停的重新整理浏覽器頁面以保證不會錯過秒殺,這些請求如果按照一般的網站應用架構,通路應用伺服器、連接配接資料庫,會對應用伺服器、資料庫伺服器造成極大的負載壓力。

3) 突然增加的網絡和伺服器帶寬

假設商品頁面大小200k(主要是商品圖檔大小),那麼需要的網絡和伺服器帶寬是2g(200k×10,000),這些網絡帶寬是因為秒殺活動新增的,超過網站平時使用的帶寬。

4) 直接下單

秒殺的遊戲規則是到了秒殺時間才能開始對商品下單購買,在此時間點之前,隻能浏覽商品資訊,不能下單。而下單頁面也是一個普通的url,如果得到這個url,不用等到秒殺開始就可以下單了。

5) 防止機器秒殺

防止網上的一些“秒殺器”

針對上面的5個問題,對應的政策如下:

1)  秒殺系統獨立部署

為了避免因為秒殺活動的高并發通路而拖垮整個網站,使整個網站不必面對蜂擁而來的使用者通路,将秒殺系統獨立部署,如果需要,還可以使用獨立的域名,以和網站完全隔離,即使秒殺系統崩潰了,也不會對網站造成任何影響。

2)  秒殺商品頁面靜态化

秒殺商品頁面重新設計,不使用網站原來的商品詳情頁面,頁面内容靜态化:商品描述,商品參數,成交記錄,使用者評價全部寫入一個靜态頁面,使用者請求不需要經過應用伺服器的業務邏輯處理,也不需要通路資料庫。是以秒殺商品服務不需要部署動态的web伺服器、資料庫伺服器。

3)  租借秒殺活動網絡帶寬

對于因為秒殺新增的網絡帶寬,必須和營運商重新購買或者租借。為了減輕網站伺服器的壓力,需要将秒殺商品頁面緩存在cdn,同樣需要和cdn服務商臨時租借新增的出口帶寬。

4)  動态生成随機下單頁面url

為了避免使用者直接通路下單頁面url,需要将該url動态化,即使秒殺系統的開發者也無法在秒殺開始前通路下單頁面的url。辦法是在下單頁面url加入由伺服器端生成的随機數作為參數,在秒殺開始的時候才能得到。

5)  防止“秒殺器”感覺很難,

因為似乎總是有辦法可以跳過設定的“障礙”。真正做到防止,僅靠webserver怕是很難防範,一般的做法都是增加一些人為的“障礙”,比如:

注冊時有一定的門檻,像皮皮書屋一樣,通過輸入程式執行結果作為驗證 –à之前批量手工注冊

參加秒殺的積分或者等級政策 -à 挂太陽,就如同你當你為了更新qq等級的時候一直挂着qq一樣。

驗證碼,阻止自動化操作 -à 可以圖像識别

ip阻止 –à 但是ip可以僞造,可以代理