【轉(zhuǎn)載】秒殺系統(tǒng)

一個(gè)簡(jiǎn)單的秒殺系統(tǒng)

實(shí)現(xiàn)原理: 通過redis原子操作減庫存

圖一

avatar
優(yōu)點(diǎn) 缺點(diǎn)
簡(jiǎn)單好用 考驗(yàn)redis服務(wù)能力
是否公平
公平
先到先得

我們稱這類秒殺系統(tǒng)為:

簡(jiǎn)單秒殺系統(tǒng)

如果剛開始QPS并不高,redis完全抗的下來的情況,完全可以依賴這個(gè)「簡(jiǎn)單秒殺系統(tǒng)」。

一個(gè)夠用的秒殺系統(tǒng)

實(shí)現(xiàn)原理: 服務(wù)內(nèi)存限流算法 + redis原子操作減庫存

圖二

avatar
優(yōu)點(diǎn) 缺點(diǎn)
簡(jiǎn)單好用 -
是否公平
不是很公平
相對(duì)的先到先得

我們稱這類秒殺系統(tǒng)為:

夠用秒殺系統(tǒng)

性能再好點(diǎn)的秒殺系統(tǒng)

實(shí)現(xiàn)原理: 服務(wù)本地內(nèi)存原子操作減庫存

服務(wù)本地內(nèi)存的庫存怎么來的?

活動(dòng)開始前分配好每臺(tái)機(jī)器的庫存,推送到機(jī)器上。

圖三

avatar
優(yōu)點(diǎn) 缺點(diǎn)
高性能 不支持動(dòng)態(tài)伸縮容(活動(dòng)進(jìn)行期間),因?yàn)閹齑媸腔顒?dòng)開始前分配好的
釋放redis壓力 -
是否公平
不是很公平
不是絕對(duì)的先到先得

我們稱這類秒殺系統(tǒng)為:

預(yù)備庫存秒殺系統(tǒng)

支持動(dòng)態(tài)伸縮容的秒殺系統(tǒng)

實(shí)現(xiàn)原理: 服務(wù)本地協(xié)程Coroutine定時(shí)redis原子操作減部分庫存到本地內(nèi)存 + 服務(wù)本地內(nèi)存原子操作減庫存

圖四

avatar
優(yōu)點(diǎn) 缺點(diǎn)
高性能 -
釋放redis壓力 -
支持動(dòng)態(tài)伸縮容(活動(dòng)進(jìn)行期間) -
具備通用性 -
是否公平
不是很公平,但是好了點(diǎn)
幾乎先到先得

我們稱這類秒殺系統(tǒng)為:

實(shí)時(shí)預(yù)備庫存秒殺系統(tǒng)

公平的秒殺系統(tǒng)

實(shí)現(xiàn)原理: 服務(wù)本地Goroutine定時(shí)同步是否售罄到本地內(nèi)存 + 隊(duì)列 + 排隊(duì)成功輪訓(xùn)(或主動(dòng)Push)結(jié)果

圖五

avatar
優(yōu)點(diǎn) 缺點(diǎn)
高性能 開發(fā)成本高(需主動(dòng)通知或輪訓(xùn)排隊(duì)結(jié)果)
真公平 -
具備通用性 -
是否公平
很公平
絕對(duì)的先到先得

我們稱這類秒殺系統(tǒng)為:

公平排隊(duì)秒殺系統(tǒng)

騷操作

上面的秒殺系統(tǒng)還不夠完美嗎?

答案:是的。

還有什么優(yōu)化的空間?

答案:靜態(tài)化獲取秒殺活動(dòng)信息的接口。

靜態(tài)化是什么意思?

答案:比如獲取秒殺活動(dòng)信息是通過接口 https://seckill.skrshop.tech/v1/acticity/get 獲取的?,F(xiàn)在呢,我們需要通過https://static-api.skrshop.tech/seckill/v1/acticity/get 這個(gè)接口獲取。有什么區(qū)別呢?看下面:

服務(wù)名 接口 數(shù)據(jù)存儲(chǔ)位置
秒殺服務(wù) seckill.skrshop.tech/v1/acticity… 秒殺服務(wù)內(nèi)存或redis等
接口靜態(tài)化服務(wù) static-api.skrshop.tech/seckill/v1/… CDN、本地文件

以前是這樣

avatar

變成了這樣

avatar

結(jié)果:可以通過接口https://static-api.skrshop.tech/seckill/v1/acticity/get就獲取到了秒殺活動(dòng)信息,流量都分?jǐn)偟搅薱dn,秒殺服務(wù)自身沒了這部分的負(fù)載。

小聲點(diǎn)說:“秒殺結(jié)果我也敢推CDN???????!?/p>

備注:
之后我們會(huì)分享`如何用Golang設(shè)計(jì)一個(gè)好用的「接口靜態(tài)化服務(wù)」`。
復(fù)制代碼

總結(jié)

上面我們得到了如下幾類秒殺系統(tǒng)

秒殺系統(tǒng)
簡(jiǎn)單秒殺系統(tǒng)
夠用秒殺系統(tǒng)
預(yù)備庫存秒殺系統(tǒng)
實(shí)時(shí)預(yù)備庫存秒殺系統(tǒng)
公平排隊(duì)秒殺系統(tǒng)

我想說的是里面沒有最好的方案,也沒有最壞的方案,只有適合你的。

先到先得來說,一定要看你們的產(chǎn)品對(duì)外宣傳,切勿上來就追逐絕對(duì)的先到先得。其實(shí)你看所有的方案,相對(duì)而言都是“先到先得”,比如,活動(dòng)開始一個(gè)小時(shí)了你再來搶,那相對(duì)于準(zhǔn)時(shí)的用戶自然搶不過,對(duì)吧。

又如預(yù)備庫存秒殺系統(tǒng),雖然不支持動(dòng)態(tài)伸縮容。但是如果你的環(huán)境滿足如下任意條件,就完全夠用了。

  • 秒殺場(chǎng)景結(jié)束時(shí)間之快,通常幾秒就結(jié)束了,真實(shí)活動(dòng)可能會(huì)發(fā)生如下情況:
    • 服務(wù)壓力大還沒掛:根本就來不及動(dòng)態(tài)伸縮容
    • 服務(wù)壓力大已經(jīng)掛了:可以先暫?;顒?dòng),服務(wù)起來&擴(kuò)容結(jié)束,用剩余庫存重新推送
  • 運(yùn)維自身不具備動(dòng)態(tài)伸縮容的能力

所以:

合適好用就行,切勿過度設(shè)計(jì)。

作者:TIGERB
鏈接:https://juejin.im/post/6844904148538753031
來源:掘金

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容