秒殺系統解決高併發?(從每一層級去考慮)
瀏覽器端(js):
- 頁面靜態化:將活動頁面上的所有可以靜態的元素全部靜態化,做圖片服務器分離,並儘量減少動態元素。通過CDN來抗峰值。
- 禁止重複提交:用戶提交之後按鈕置灰,禁止重複提交
- 用戶限流:在某一時間段內只允許用戶提交一次請求,比如可以採取IP限流
項目後端方案:
1、web層
如果請求過多,判定web服務器的壓力過大,增加前端的web服務器,做負載均衡
2、服務層
如果請求的靜態頁面不卡了,但是請求的動態數據還是卡,說明mysql處理的請求太多了,即當秒殺的用戶量很大時,即使每個用戶只有一個請求,到服務層的請求數量還是很大。比如我們有100W用戶同時搶100臺手機,服務層併發請求壓力很大。這時可採用以下兩種辦法:
- 採用消息隊列緩存請求:既然服務層知道庫存只有100臺手機,那完全沒有必要把100W個請求都傳遞到數據庫啊,那麼可以先把這些請求都寫到消息隊列緩存一下,數據庫層訂閱消息減庫存,減庫存成功的請求返回秒殺成功,失敗的返回秒殺結束。
- 利用緩存應對寫請求:緩存也是可以應對寫請求的,比如我們就可以把數據庫中的庫存數據轉移到Redis緩存中,所有減庫存操作都在Redis中進行,然後再通過後臺進程把Redis中的用戶秒殺請求同步到數據庫中。
3、數據庫層
數據庫層是最脆弱的一層,一般在應用設計時在上游就需要把請求攔截掉,數據庫層只承擔“能力範圍內”的訪問請求,所以,上面通過在服務層引入隊列或緩存,讓最底層的數據庫高枕無憂。若是還是不行,則數據庫也可以做主從,讀寫分離增加其能力範圍內的查詢。
其實很多時候看文字並不能很好的轉換成實際應用案例,很多人需要的是我手把手的教你,究竟怎麼去提升所謂併發量!
珍藏了一份mu課網Java併發編程與高併發解決方案(完整視頻+源碼+筆記)
先詳細講解併發編程的基礎(這一步很重要在代碼中有併發編程的代碼思維和做企業項目只有crud的思維是很不同的!這一步不能缺失!深入併發編程的原理!)
再通過多維度講解如何一步步搭建起一個實用實戰的高可用高併發產品。包括緩存高可用,消息隊列高可用,分佈式拆分,應用限流,服務降級,服務熔斷,數據庫分庫分表高可用等實戰技能!
老規矩,新粉絲!還是一樣的,只需留言點贊轉發關注後,在我的主頁私信【高併發】即可!(不信有人手打)
閱讀更多 java進階架構師 的文章