Jmeter Springboot Redisson分佈式鎖併發訂單操作(下單、取消單、完成單、加庫存)

Jmeter+Springboot+Redisson分佈式鎖併發訂單操作(下單、取消單、完成單、加庫存)

涉及知識點:

java+springboot+mybatis開發

redis分佈式鎖+Redisson客戶端

Jmeter各種騷操作:用戶變量、隨機取值、jdbc操作、if else操作、循環、控制器、beanshell斷言等等

  1. 環境工具:

    idea、jmeter

    jdk1.8、maven、mysql、redis

    三臺服務器:兩個4C16G服務節點+一個臺nginx(淘寶的tengine-2.3.0)節點
  2. 思路概要:

    (1) 主要提供四個接口:下單、取消、出庫、添加庫存,四種操作在操作庫存表t_stock_demo行的時候都需要添加Redis的鎖,使用:Future<Boolean> res = fairLock.tryLockAsync(50, 10, TimeUnit.SECONDS);

    (2) 另外取消和出庫,因爲是用Jmeter直接查詢數據庫獲取可用的訂單數量,爲防止統一訂單重複操作在RestSevice層使用訂單號orderNo做了一層Redis分佈式鎖,訂單已在操作直接返回結果。

    (3) 使用jmeter的jdbc操作+函數、隨機數獲取已確認的訂單結合if控制器判斷結果,進行取消和出庫操作

    (4) 劃重點:使用分佈式鎖和本地事物,一定要先提交事物再釋放鎖、先提交事物再放鎖、先提交事物再放鎖

  3. SQL、jmeter腳本、jar包啓動腳本請到doc目錄查看。
  4. 操作指南:

    (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)]

  5. 遺留一個業務問題:

    總庫存(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的平衡,這個要業務邏輯要怎麼處理?有大佬解答?

GitHub源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章