案例:秒殺程序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中,這個步驟併發量相對小一點,使用數據庫的事務解決數據一致性問題