Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

154 řádky
5.3 KiB

  1. #!/bin/bash
  2. # Master-Slave 余额同步测试脚本
  3. # 用法: ./test_region_sync.sh [USER_ID]
  4. # 示例: ./test_region_sync.sh 1
  5. MASTER="http://172.22.57.85:23000"
  6. SLAVE="http://172.22.57.85:13000"
  7. API_KEY="123456789"
  8. USER_ID=${1:-1} # 默认用户ID为1,可通过参数传入
  9. echo "=========================================="
  10. echo " Master-Slave 余额同步测试"
  11. echo "=========================================="
  12. echo "Master: $MASTER"
  13. echo "Slave: $SLAVE"
  14. echo "API Key: $API_KEY"
  15. echo "测试用户ID: $USER_ID"
  16. echo "=========================================="
  17. echo ""
  18. # 测试7:完整消费流程测试
  19. echo "=== 测试7: 完整消费流程测试 ==="
  20. echo ""
  21. echo "[步骤1] 查询Master当前余额..."
  22. RESULT=$(curl -s -X POST "$MASTER/api/internal/sync/quota/query" \
  23. -H "Content-Type: application/json" \
  24. -H "X-Sync-API-Key: $API_KEY" \
  25. -H "X-Sync-Node: $SLAVE" \
  26. -d "{\"user_id\": $USER_ID}")
  27. echo "结果: $RESULT"
  28. BEFORE_QUOTA=$(echo $RESULT | grep -o '"quota":[0-9]*' | grep -o '[0-9]*')
  29. echo "当前余额: $BEFORE_QUOTA"
  30. echo ""
  31. echo "[步骤2] 执行扣费500..."
  32. RESULT=$(curl -s -X POST "$MASTER/api/internal/sync/quota/batch-deduct" \
  33. -H "Content-Type: application/json" \
  34. -H "X-Sync-API-Key: $API_KEY" \
  35. -H "X-Sync-Node: $SLAVE" \
  36. -d "{\"records\": [{\"user_id\": $USER_ID, \"request_id\": \"req-test-$(date +%s)\", \"quota\": 500}]}")
  37. echo "结果: $RESULT"
  38. echo ""
  39. echo "[步骤3] 再次查询Master余额验证扣费成功..."
  40. RESULT=$(curl -s -X POST "$MASTER/api/internal/sync/quota/query" \
  41. -H "Content-Type: application/json" \
  42. -H "X-Sync-API-Key: $API_KEY" \
  43. -H "X-Sync-Node: $SLAVE" \
  44. -d "{\"user_id\": $USER_ID}")
  45. echo "结果: $RESULT"
  46. AFTER_QUOTA=$(echo $RESULT | grep -o '"quota":[0-9]*' | grep -o '[0-9]*')
  47. echo "扣费后余额: $AFTER_QUOTA"
  48. if [ "$BEFORE_QUOTA" != "" ] && [ "$AFTER_QUOTA" != "" ]; then
  49. DIFF=$((BEFORE_QUOTA - AFTER_QUOTA))
  50. if [ "$DIFF" -eq 500 ]; then
  51. echo "✅ 测试7通过: 余额正确扣除了500"
  52. else
  53. echo "❌ 测试7失败: 余额变化为$DIFF,期望为500"
  54. fi
  55. fi
  56. echo ""
  57. # 测试8:并发扣费测试
  58. echo "=== 测试8: 并发扣费测试 ==="
  59. echo ""
  60. echo "[步骤1] 查询当前余额..."
  61. RESULT=$(curl -s -X POST "$MASTER/api/internal/sync/quota/query" \
  62. -H "Content-Type: application/json" \
  63. -H "X-Sync-API-Key: $API_KEY" \
  64. -H "X-Sync-Node: $SLAVE" \
  65. -d "{\"user_id\": $USER_ID}")
  66. BEFORE_QUOTA=$(echo $RESULT | grep -o '"quota":[0-9]*' | grep -o '[0-9]*')
  67. echo "当前余额: $BEFORE_QUOTA"
  68. echo ""
  69. echo "[步骤2] 并发发送10个扣费请求(每个100)..."
  70. for i in {1..10}; do
  71. curl -s -X POST "$MASTER/api/internal/sync/quota/batch-deduct" \
  72. -H "Content-Type: application/json" \
  73. -H "X-Sync-API-Key: $API_KEY" \
  74. -H "X-Sync-Node: $SLAVE" \
  75. -d "{\"records\": [{\"user_id\": $USER_ID, \"request_id\": \"req-concurrent-$i-$(date +%s%N)\", \"quota\": 100}]}" > /dev/null &
  76. done
  77. wait
  78. echo "并发请求发送完成"
  79. echo ""
  80. echo "[步骤3] 查询最终余额..."
  81. sleep 1
  82. RESULT=$(curl -s -X POST "$MASTER/api/internal/sync/quota/query" \
  83. -H "Content-Type: application/json" \
  84. -H "X-Sync-API-Key: $API_KEY" \
  85. -H "X-Sync-Node: $SLAVE" \
  86. -d "{\"user_id\": $USER_ID}")
  87. AFTER_QUOTA=$(echo $RESULT | grep -o '"quota":[0-9]*' | grep -o '[0-9]*')
  88. echo "最终余额: $AFTER_QUOTA"
  89. if [ "$AFTER_QUOTA" != "" ] && [ "$AFTER_QUOTA" -ge 0 ]; then
  90. echo "✅ 测试8通过: 余额不为负数"
  91. else
  92. echo "❌ 测试8失败: 余额为负数或查询失败"
  93. fi
  94. echo ""
  95. # 测试10:幂等性测试
  96. echo "=== 测试10: 重复请求幂等性测试 ==="
  97. echo ""
  98. REQUEST_ID="req-idempotent-$(date +%s)"
  99. echo "[步骤1] 发送扣费请求 request_id=$REQUEST_ID..."
  100. RESULT=$(curl -s -X POST "$MASTER/api/internal/sync/quota/batch-deduct" \
  101. -H "Content-Type: application/json" \
  102. -H "X-Sync-API-Key: $API_KEY" \
  103. -H "X-Sync-Node: $SLAVE" \
  104. -d "{\"records\": [{\"user_id\": $USER_ID, \"request_id\": \"$REQUEST_ID\", \"quota\": 100}]}")
  105. echo "结果: $RESULT"
  106. AFTER_FIRST=$(curl -s -X POST "$MASTER/api/internal/sync/quota/query" \
  107. -H "Content-Type: application/json" \
  108. -H "X-Sync-API-Key: $API_KEY" \
  109. -H "X-Sync-Node: $SLAVE" \
  110. -d "{\"user_id\": $USER_ID}" | grep -o '"quota":[0-9]*' | grep -o '[0-9]*')
  111. echo "第一次扣费后余额: $AFTER_FIRST"
  112. echo ""
  113. echo "[步骤2] 再次发送相同request_id的请求..."
  114. RESULT=$(curl -s -X POST "$MASTER/api/internal/sync/quota/batch-deduct" \
  115. -H "Content-Type: application/json" \
  116. -H "X-Sync-API-Key: $API_KEY" \
  117. -H "X-Sync-Node: $SLAVE" \
  118. -d "{\"records\": [{\"user_id\": $USER_ID, \"request_id\": \"$REQUEST_ID\", \"quota\": 100}]}")
  119. echo "结果: $RESULT"
  120. AFTER_SECOND=$(curl -s -X POST "$MASTER/api/internal/sync/quota/query" \
  121. -H "Content-Type: application/json" \
  122. -H "X-Sync-API-Key: $API_KEY" \
  123. -H "X-Sync-Node: $SLAVE" \
  124. -d "{\"user_id\": $USER_ID}" | grep -o '"quota":[0-9]*' | grep -o '[0-9]*')
  125. echo "第二次扣费后余额: $AFTER_SECOND"
  126. echo ""
  127. if [ "$AFTER_FIRST" == "$AFTER_SECOND" ]; then
  128. echo "✅ 测试10通过: 重复请求没有重复扣费"
  129. else
  130. echo "⚠️ 测试10警告: 余额发生了变化,当前实现可能不支持幂等性"
  131. echo " (第一次: $AFTER_FIRST, 第二次: $AFTER_SECOND)"
  132. fi
  133. echo ""
  134. echo "=========================================="
  135. echo " 测试完成"
  136. echo "=========================================="