如何對秒殺系統(tǒng)進行流量削峰?
首先我們看一下秒殺系統(tǒng)的業(yè)務流程,大致如下:
1.首先判斷庫存夠不夠
2.如果夠就扣庫存
3.創(chuàng)建訂單然后支付
接下來我們需要了解秒殺系統(tǒng)的一個特征,往往是請求遠遠大于庫存量,幾千或者上萬的用戶去搶一個商品,也就是說可能90%的請求最后其實都是無效的;所以在這個前提下我們來看看如何削峰;
1.分布式限流
如何過濾掉大部分無效的流量,比如秒殺的訂單量為10,就算來了100w的用戶,最后其實也只會生成10個訂單,所以在前端就把無效的用戶攔截,防止大量的請求都去檢查庫存是不是夠,導致數(shù)據(jù)庫掛掉;分布式限流可以通過redis去實現(xiàn),初始化一個限制大小即可,超過限制大小直接丟棄請求;
2.分布式緩存庫存
比如我們數(shù)據(jù)庫里面有10件商戶用來秒殺,其實可以把這個數(shù)據(jù)放在分布式緩存里面,這樣檢查庫存的時候就不需要去查數(shù)據(jù)庫了,直接在緩存里面檢查,速度會快很多;
3.異步扣庫存
扣庫存肯定要同步到數(shù)據(jù)庫中,這時候其實可以不用同步更新,可以通過消息隊列來異步更新,比如rocketmq,每次把更新操作放入隊列即可,由消費端去更新操作;
4.異步創(chuàng)建訂單
同上,創(chuàng)建訂單也可以通過消息隊列來異步創(chuàng)建;
總結
其實記住幾個核心點就行:盡早的隔離無效數(shù)據(jù),能用緩存的地方不要直接去查數(shù)據(jù)庫,能用異步的地方不要去同步。