高併發相關

案例:秒殺程序css

 

高併發優化思路前端

1.使用Google guava的RateLimiter來進行限流nginx

2.暴露秒殺接口,暴露信息,做爲不常更新的熱點數據,貯存到Redis裏算法

3.減庫存時,在同一事務內,先"插入記錄",再"更新庫存", 能有效減小行鎖的做用時間. 數據庫更新操做,採用樂觀鎖,提升併發性數據庫

4.前端靜態文檔部署到CDN, 缺乏資金的公司能夠選擇動靜分離。動靜分離:把靜態資源(js,css,圖片)直接部署放到nginx, 動態服務還在原有的tomcat/SpringBoot裏。tomcat

5.Java應用部署多個集羣節點,之間使用nginx作負載均衡和反向代理,提升客戶端的併發數併發

6.RabbitMQ異步處理秒殺記錄負載均衡

 

 

部署圖:異步

 

 

秒殺過程高併發

秒殺進行的過程包含兩步驟:

步驟一(秒殺):在Redis裏進行秒殺。 這個步驟用戶併發量很是大,搶到後,給與30分鐘的時間等待用戶付款, 若是用戶過時未付款,則Redis庫存加1 ,算用戶自動放棄付款。

流程圖Step1:

1.先通過Nginx負載均衡;

2.Nginx裏面經過配置文件配置限流功能,限流算法是漏桶法;

3.Redis判斷是否秒殺過。避免重複秒殺。若是沒有秒殺過,把用戶名和seckillId封裝成一條消息發送到RabbitMQ,請求變成被順序串行處理當即返回狀態「排隊中」到客戶端上,客戶端上回顯示「排隊中...」

4.後臺監聽RabbitMQ裏消息,每次取一條消息,並解析後,請求Redis作庫存減1操做(decr命令),並手動ACK隊列 若是減庫存成功,則在Redis裏記錄下庫存成功的用戶手機號userPhone.

5.流程圖Step2:客戶端排隊成功後,定時請求後臺查詢是否秒殺成功,後面會去查詢Redis是否秒殺成功,若是搶購成功,或者搶購失敗則中止定時查詢, 若是是排隊中,則繼續定時查詢。

 

步驟二(付款):用戶付款成功後,後臺把付款記錄持久化到MySQL中,這個步驟併發量相對小一點,使用數據庫的事務解決數據一致性問題

相關文章
相關標籤/搜索