來源:北大青鳥總部 2020年10月23日 13:42
國慶小長假已經(jīng)結(jié)束了,還沒有從吃土的日子中結(jié)束,雙十一又要來了。像淘寶、京東、拼多多等大型電商平臺已經(jīng)在造勢了,技術(shù)同學(xué)做系統(tǒng)演練、線上壓測、性能優(yōu)化等工作,市場同學(xué)在線下平臺、廣告平臺、新媒體平臺都在宣傳。對于雙十一來說,最激動人心的無疑就是秒殺商品了,在限定的時間內(nèi),以最便宜的價格,搶到商品。有的人可能會問,那么秒殺系統(tǒng)都是怎么樣的呢?我們公司規(guī)模比較小,怎么合適的設(shè)計秒殺系統(tǒng)呢?今天小編就給大家介紹幾種秒殺系統(tǒng)的設(shè)計。
在這幾種秒殺系統(tǒng)的設(shè)計中,最基本的組件就是redis,那么秒殺服務(wù)為什么都用redis?答案:性能好。redis基于內(nèi)存讀取數(shù)據(jù),而傳統(tǒng)的數(shù)據(jù)庫是基于磁盤讀取數(shù)據(jù)。在使用redis數(shù)據(jù)庫時,用戶請求來了之后,后端直接去內(nèi)存獲取數(shù)據(jù),并且同步把數(shù)據(jù)寫入磁盤,返回給到前端。使用mysql數(shù)據(jù)庫時,用戶請求來了之后,后端需要去磁盤獲取數(shù)據(jù),再返回給到前端。從數(shù)據(jù)的獲取流程來看,Redis很快,并且通過redis性能測試數(shù)據(jù),redis單線程QPS達(dá)到40000+,能夠扛住大量的用戶請求,因此實(shí)現(xiàn)秒殺系統(tǒng),使用redis是最好的選擇。
方案1
只使用Redis
對于小公司或個人創(chuàng)業(yè)者來說,用戶規(guī)模沒有多大,技術(shù)人員也有限,在資源有限的情況下,采取這個方案是最合適的。
通過PHP+Mysql+Linux服務(wù)器搭建一個電商網(wǎng)站,
方案2
限流+使用redis
對于有一定業(yè)務(wù)規(guī)模,但是開發(fā)資源比較緊張的公司,可以采取這種模式。相比方案1,它增加了一個限流機(jī)制,通過訪問數(shù)的限制,提高了系統(tǒng)性能。還是剛剛的例子,小A創(chuàng)建的二手電子交易平臺,隨著質(zhì)量不錯、價格合適,積累了一定量的用戶。有了用戶就需要運(yùn)營了,因此他也搞搞活動促銷啥的,在雙十一99元買小米手機(jī),總共50臺,促銷信息在網(wǎng)站上放出,這時候一下子來了100多個用戶,每次都需要去請求redis減庫存比較耗費(fèi)性能,因此在限流算法處設(shè)置每秒最多請求20個,超過的請求就排隊等著
方案3
設(shè)置固定機(jī)器的庫存+redis
對于業(yè)務(wù)規(guī)模中型時,開發(fā)資源比較緊張的公司,可以采取這種模式。當(dāng)業(yè)務(wù)發(fā)展到中型規(guī)模時,系統(tǒng)一般會采用集群模式進(jìn)行部署,也就是把服務(wù)部署在多臺機(jī)器上,同時對外提供服務(wù),提升性能。這時候運(yùn)營人員可以設(shè)置每臺機(jī)器能處理的最多庫存數(shù)量,當(dāng)用戶請求進(jìn)來后,程序判斷總請求量與機(jī)器庫存量大小,如果較小則請求成功,可以購買,如果較大則請求失敗。
方案4
實(shí)時輪詢庫存+redis
對于業(yè)務(wù)中大型規(guī)模的公司來說,比如有數(shù)10萬用戶,雖然開發(fā)成本高,但由于用戶規(guī)模、團(tuán)隊規(guī)模有一定積累,這種方案是比較適合的。在方案3中主要是靠運(yùn)營人員或運(yùn)維根據(jù)工作經(jīng)驗(yàn)判斷設(shè)置的閾值,不夠靈活。同一件商品,因?yàn)椴煌赜蛉嗣竦南M(fèi)能力都不一樣,在北京區(qū)域的售賣情況和在成都云南的售賣肯定不一樣。通過在算法中增加多協(xié)程判斷秒殺現(xiàn)況,動態(tài)的擴(kuò)縮容。當(dāng)用戶過來時,輪詢算法初步判斷庫存是否為空,如果為空則秒殺結(jié)束,如果不為空,則進(jìn)入排隊(用戶感受就是加入購物車但無法支付),所有的用戶請求進(jìn)入排隊隊列后,輪詢算法再次判斷庫存情況,決定多少請求可以出隊列,出隊列的請求用戶就可以成功秒殺了。
方案5
前端限流+后端限流+實(shí)時輪詢+redis
對于業(yè)務(wù)體量比較大的公司,比如京東、淘寶、拼多多這種規(guī)模級別,服務(wù)上億的用戶,研發(fā)資源充裕,就可以采用這種方案。當(dāng)用戶在前端發(fā)起請求后,通過CDN(內(nèi)容分發(fā)網(wǎng)絡(luò))前端可以把商品信息等靜態(tài)頁面信息部署在離用戶請求最近的地方,加快用戶訪問服務(wù),當(dāng)用戶請求進(jìn)入后端后,通過Nginx負(fù)載均衡將請求分發(fā)到不同的秒殺服務(wù)集群,秒殺服務(wù)將信息寫入Redis主數(shù)據(jù)庫,再從Redis從數(shù)據(jù)庫獲取信息,Redis的主從部署、讀寫分離,更好的保障了服務(wù)高可用,最后再通過MQ消息隊列來做流量的削峰(超過閾值請求就進(jìn)不來了,商品售完了)、用戶請求的排隊,實(shí)現(xiàn)了高并發(fā)、高可用、高性能的秒殺系統(tǒng)。
通過本文秒殺系統(tǒng)設(shè)計的介紹,相信你已經(jīng)非常清晰秒殺系統(tǒng)的設(shè)計了。雙十一很快就到了,又是一年買買買的時刻,趕緊動手設(shè)計一個秒殺系統(tǒng),助力你的業(yè)務(wù)吧。