一個(gè)簡(jiǎn)單的秒殺系統(tǒng)
實(shí)現(xiàn)原理: 通過redis原子操作減庫存
圖一
| 優(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原子操作減庫存
圖二
| 優(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ī)器上。
圖三
| 優(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)存原子操作減庫存
圖四
| 優(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é)果
圖五
| 優(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、本地文件 |
以前是這樣
變成了這樣
結(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
來源:掘金