如何設計一個秒殺系統,其實我思考了很久,今天就把我想到了寫下來記錄一下:
所謂秒殺操作就是同一時間段內很多用戶搶購有限的商品,因此秒殺的併發量是很高的。
用戶點擊秒殺的時候,會異步的取服務端的時間,然後在執行秒殺,如果執行秒殺的時間小於服務端設定的時間,
那麼提示用戶秒殺尚未開啓,如果時間在秒殺的範圍內,服務端會返回秒殺接口地址,一般url的某個字段是加密值,用戶點擊後可以執行秒殺。
如果秒殺後
前端:
1.通過動靜分離 把靜態頁面部署到CDN上,這樣可以降低我們系統的壓力,用戶的體驗也會提高
2.因爲秒殺的時候用戶可能會一直的刷新,前端可以做一些控制
3.然後通過前端web服務器用nginx 做負載均衡和反向代理
後端:
後端一般都是一個集羣
1.在redis集羣中維護一個原子計數器(Atomic counter),數量提前設定好,用戶請求到來的時候直接對這個原子計數器
進行操作,如果原子計數器大於0那麼,減去1,然後插入一條用戶秒殺的消息到rabbitmq中(或者其他消息隊列),然後又消費者來消費這個rabbitmq產生的消息,把對應的記錄寫到數據庫中;如果原子計數器小與等於0,那麼返回秒殺已經結束。
2.如果數據庫壓力很大,那麼對數據庫可以進行分庫,分表
3.數據庫端也可以使用存儲過程,減少服務器端到數據庫的傳輸時延,以及服務端GC造成的延遲
前一段時間在面試的時候,面試過跟我分享了一個新的思路,比如1000W個人搶10個商品,那麼我只讓10條流量進來不就可以了?其他的都到不了我的後臺的應用程序,我覺得這是一個很好的一個思路,或許有點不公平,但是對於流量的隨機選取 只抽取10條算是比較公平的了。