Jmeter+Springboot+Redisson分佈式鎖併發訂單操作(下單、取消單、完成單、加庫存)
涉及知識點:
java+springboot+mybatis開發
redis分佈式鎖+Redisson客戶端
Jmeter各種騷操作:用戶變量、隨機取值、jdbc操作、if else操作、循環、控制器、beanshell斷言等等
- 環境工具:
idea、jmeter
jdk1.8、maven、mysql、redis
三臺服務器:兩個4C16G服務節點+一個臺nginx(淘寶的tengine-2.3.0)節點 - 思路概要:
(1) 主要提供四個接口:下單、取消、出庫、添加庫存,四種操作在操作庫存表t_stock_demo行的時候都需要添加Redis的鎖,使用:
Future<Boolean> res = fairLock.tryLockAsync(50, 10, TimeUnit.SECONDS);
(2) 另外取消和出庫,因爲是用Jmeter直接查詢數據庫獲取可用的訂單數量,爲防止統一訂單重複操作在RestSevice層使用訂單號orderNo做了一層Redis分佈式鎖,訂單已在操作直接返回結果。
(3) 使用jmeter的jdbc操作+函數、隨機數獲取已確認的訂單結合if控制器判斷結果,進行取消和出庫操作
(4) 劃重點:使用分佈式鎖和本地事物,一定要先提交事物再釋放鎖、先提交事物再放鎖、先提交事物再放鎖 - SQL、jmeter腳本、jar包啓動腳本請到doc目錄查看。
- 操作指南:
(1) git clone https://github.com/Xlinlin/SpringCloud-Demo
(2) cd SpringCloud-Demo/SpringBoot-Stock-Demo
(3) 配置數據mysql和redis配置,application.yml文件,(自行準備mysql、redis環境)
(4) mvn install
(5) 拷貝stock_demo.jar和doc/bootstrap.sh到 linux服務器(自行準備java環境)上
(6) 適當修改bootstrap.sh腳本目錄,保持與springboot包在同一目錄,直接執行腳本:./bootstrap start
(7) 查看進程、端口是否啓動:jps 或 ps -ef|grep stock_demo 或 lsof -i:7878
(8) 配好nginx跳轉
(9) 下載jmeter ,解壓進入jmeter目錄,雙擊:ApacheJMeter
(10) 文件->打開->找到doc下的.jmx文件,大概的畫面:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-HF7yCU8S-1571799492489)(https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/stock_demo_jmeter.jpg?raw=true)]
(11) 修改遠程服務器地址信息爲你的nginx服務
(12) 修改你的數據地址,此處需要將mysql的驅動jar包引入jmeter/lib目錄下
(13) 線程、參數、請求調整好後,然後點擊啓動(Ctrl+R)
部分截圖:
(14) 後臺日誌[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Z4S3U8W0-1571799492490)(https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/sever_console_log.jpg?raw=true)]
(15) 庫存表[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XpEUFhgD-1571799492490)(https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/stock_query.jpg?raw=true)]
(16) 訂單表[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Aw1Y1btL-1571799492491)(https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/order_query.jpg?raw=true)] - 遺留一個業務問題:
總庫存(Total) = 可用庫存(Ava) + 預佔庫存(Prev)
A:下單:T A- P+
B:取消:T A+ P-
C:出庫:T- A P-
D:同步庫存+:T+ A+ P
E:同步庫存-:T- A- P
如果僅僅只是 A+B 或者 A+C 或A B C併發跑能保證 T=P+A
但是 A +B+C+D +E 併發跑,就一定會出現 打破這個 T=P+A的平衡,這個要業務邏輯要怎麼處理?有大佬解答?