很多的電商平台,在節假日如雙十一,618等都會有商品描述的活動,今天和大家討論一下,如何設計乙個秒殺系統。什麼是秒殺
在一定的時間內幾秒或者幾分鐘,對一定數量的庫存進行出賣。
1,在秒殺之前,比如上午十點開始秒殺,很多使用者可能在九點五十左右就開始訪問自己心儀的秒殺商品,這樣就會出現在秒殺之前用很多的併發量,所以在秒殺之前的半個小時之前,是否可以將參加秒殺活動商品的一些資訊快取起來,這樣就可以減小因為高併發訪問,給資料庫帶來的壓力。
2,有的使用者為了搶到商品可能利用第三外掛程式,去頻繁的訪問介面,這樣給介面會帶來很大的壓力,為了避免這種刻意的刷單問題,可以在後台對同乙個使用者的訪問頻率做限制,可以**介面的實際訪問頻率,然後對不同的介面,同乙個使用者做頻率限制,如某個搶購入口,可以設定乙個使用者一分鐘不能訪問超過60次,10秒內不能超過20次等不同時段不同訪問頻率策略,這個可以通過redis等快取框架做到,列入以某個介面+使用者唯一性標準為key,可以選擇value為string型別,如果快取更多資料,value可以選擇hash型別,value的值是int型別,這樣使用者每次訪問介面,可以先判斷該值有沒有達到預設的訪問頻率限制的值,如果達到了,就告訴使用者,你的訪問太過頻繁,請多長時間後再試,或者要求使用者輸入驗證碼(驗證碼或者簡訊驗證碼)。如果沒有達到預設值,就給int值技術加一,在第一次訪問的時候,即查詢的前exist判斷,如果不存在,插入第一條資料,並且設定過氣時間,這個時間就是訪問頻率的時間限制例如一分鐘只能訪問60次,那麼這裡的過期時間就是60秒,預設值就是60次。這樣就可以從一定程度上避免刷單問題。
3,乙個使用者可能當初註冊了很多的賬號,平時不用,專門用來參加秒殺活動,這樣其實也會造成系統壓力。解決方式和上述差不多,只是對ip做限制,但是怎樣做可能傷到真實的使用者,因為有的場合如網咖,裡面人購物其實是同乙個ip出口,這個時候,其實也可以對使用者的等級做限制,只有多高的等級才可以參加秒殺活動。
前端:頁面靜態化,禁止重複提交。
後端:可拓展,快取,限流,削峰,非同步處理
資料庫層是最脆弱的一層,一般在應用設計時在上游就需要把請求攔截掉,資料庫層只承擔「能力範圍內」的訪問請求。所以,上面通過在服務層引入佇列和快取,讓最底層的資料庫高枕無憂。
案例:利用redis+mysql實現簡單的秒殺系統
redis是乙個分布式key-value快取系統,value支援多種資料結構,這裡value可以選擇兩種型別,string(或者hash):主要用於記錄商品的庫存,對商品減庫存。set集合(這裡不要用list集合,list集合是可重複的,set是不可重複的,可以保證乙個使用者只賣一次,如果乙個使用者可以買多次那麼可以使用list集合):用於儲存使用者的id獲取其他唯一確定乙個使用者的值。
在秒殺開始的前:可以使用批處理,將參加秒殺的產品資訊快取到redis中。這裡將產品的業務唯一字段作為key,庫存作為value。這裡的key要和前端快取的key一致。
在秒殺開始時::使用者大量提交。根據使用者提交的產品資訊,獲取到redis中需要的key值,查詢快取(為了保證快取有效,如果第一次沒有查詢到,可以到資料庫查詢,然後在快取一下,不過一般不會出現),得到庫存量,判斷當前庫存是否大於零,如果大於零,判斷當前的set集合中是否用該使用者id,如果沒有,減庫存並且將使用者的id放入集合中,並對庫存減一,如果庫存為0,提示使用者,商品已售完等文案資訊,如果集合中已經存在該使用者id,則不做任何處理,直接處理下乙個請求。直到最後庫存售完,上面的過程可以利用redis事務和watch功能完成對資料一致性的控制即超賣問題。
庫存售完後:程式開始啟動乙個有個後台執行緒,可以阻塞等待商品庫存售完的通知,在上面一步,庫存一旦售完,後台程序獲取set集合中的使用者資訊,非同步處理需要操作的購買等後續操作。
這只是乙個簡單的秒殺系統,實際的秒殺系統,還要考慮到很多的真實場景需要很多完善的地方,希望大家一起討論如何設計乙個秒殺系統。
如何設計乙個秒殺系統
秒殺場景一般會在電商 舉行一些活動或者節假日在12306 上搶票時遇到。對於電商 中一些稀缺或者 商品,電商 一般會在約定時間點對其進行限量銷售,因為這些商品的特殊性,會吸引大量使用者前來搶購,並且會在約定的時間點同時在秒殺頁面進行搶購。限流 鑑於只有少部分使用者能夠秒殺成功,所以要限制大部分流量,...
如何設計乙個秒殺系統
秒殺場景一般會在電商 舉行一些活動或者節假日在12306 上搶票時遇到。對於電商 中一些稀缺或者 商品,電商 一般會在約定時間點對其進行限量銷售,因為這些商品的特殊性,會吸引大量使用者前來搶購,並且會在約定的時間點同時在秒殺頁面進行搶購。限流 鑑於只有少部分使用者能夠秒殺成功,所以要限制大部分流量,...
如何設計乙個秒殺系統
秒殺一般是訪問請求數量遠遠大於庫存數量,只有少部分使用者能夠秒殺成功。秒殺業務流程比較簡單,一般就是下訂單減庫存。瀏覽器端 js 服務端控制器層 閘道器層 服務層利用快取應對讀請求 對類似於12306等購票業務,是典型的讀多寫少業務,大部分請求是查詢請求,所以可以利用快取分擔資料庫壓力。利用快取應對...