This commit is contained in:
2025-10-17 20:56:50 +08:00
commit 90094ccd5a
342 changed files with 144988 additions and 0 deletions

View File

@@ -0,0 +1,341 @@
# 问题修复 - 发车超时和统计错误 v3.9.5
## 📋 问题描述
用户在v3.9.4版本10秒超时下进行批量发车测试出现了两个严重问题
### 问题1所有账号仍然超时
```
❌ [token_1759886453287_lk84gjtj0] 发车任务失败: Error: 请求超时: car_getrolecar (10000ms)
❌ [token_1759886453292_gp9mb8zqp] 发车任务失败: Error: 请求超时: car_getrolecar (10000ms)
... (所有6个账号都超时)
```
### 问题2统计信息完全错误
```
batchTaskStore.js:1414 📊 统计信息: {total: 6, success: 6, failed: 0}
batchTaskStore.js:1461 ✅ 所有任务成功完成!
```
**明明6个账号全部失败却显示 `success: 6, failed: 0`**
---
## 🔍 深度分析
### 问题1原因服务器无响应
从日志中可以看到:
1. ✅ 6个账号全部成功连接WebSocket
2. ✅ 6个账号全部发送了 `car_getrolecar` 命令
3.**服务器10秒内没有返回任何 `car_getrolecarresp` 响应**
4. ❌ 只有心跳消息在不断发送
这说明:
- **服务器在并发6个查询时处理不过来**
- **10秒超时仍然不够**
### 问题2原因任务结果检查逻辑错误
#### 代码逻辑缺陷
1. `executeTask` 函数在失败时**返回一个对象**
```javascript
catch (error) {
return {
task: '发车',
success: false, // ❌ 返回失败标记
error: error.message
}
}
```
2. 但 `executeTokenTasks` 函数**没有检查这个标记**
```javascript
const result = await executeTask(tokenId, taskName)
// 保存任务结果
taskProgress.value[tokenId].result[taskName] = {
success: true, // ❌ 硬编码为true
data: result
}
```
3. 结果:
- `executeTask` 没有抛出异常,所以 `executeTokenTasks` 认为任务成功
- 失败的任务被记录为 `success: true`
- `taskFailedCount` 不会增加
- 统计信息显示 `success: 6, failed: 0`
#### 为什么会出现两行日志?
```
batchTaskStore.js:1333 ❌ [token_xxx] 发车任务失败: Error: 请求超时: car_getrolecar (10000ms)
batchTaskStore.js:380 ✅ 任务完成: sendCar
```
- **第1333行**`executeTask` 中的 catch 块打印的错误
- **第380行**`executeTokenTasks` 中的成功日志(因为没有检查 `result.success`
---
## ✅ 解决方案
### 修复1增加超时 + 降低并发
| 参数 | 修复前 | 修复后 | 说明 |
|------|-------|-------|------|
| **查询超时** | 10000ms (10秒) | **20000ms (20秒)** | ⬆️ +100% |
| **默认并发数** | 5个 | **3个** | ⬇️ -40% |
**修改位置**`src/stores/batchTaskStore.js`
- 第1134行初次查询车辆 `10000` → `20000`
- 第1209行刷新后重新查询 `10000` → `20000`
- 第1280行发送前重新查询 `10000` → `20000`
- 第50行默认并发数 `'5'` → `'3'`
### 修复2正确检查任务结果
**修改前**
```javascript
try {
const result = await executeTask(tokenId, taskName)
// 保存任务结果
taskProgress.value[tokenId].result[taskName] = {
success: true, // ❌ 硬编码为true
data: result
}
taskProgress.value[tokenId].tasksCompleted++
console.log(` ✅ 任务完成: ${taskName}`)
} catch (error) {
// 保存错误信息
taskFailedCount++
}
```
**修改后**
```javascript
try {
const result = await executeTask(tokenId, taskName)
// ✅ 检查任务是否真的成功某些任务可能返回包含success字段的对象
const isSuccess = result?.success !== false
if (!isSuccess) {
// ❌ 任务返回失败标记
console.error(` ❌ 任务失败: ${taskName}`, result?.error || '未知错误')
taskProgress.value[tokenId].result[taskName] = {
success: false,
error: result?.error || '任务执行失败',
data: result?.data
}
taskFailedCount++ // 增加失败计数
} else {
// ✅ 任务成功
taskProgress.value[tokenId].result[taskName] = {
success: true,
data: result
}
taskProgress.value[tokenId].tasksCompleted++
console.log(` ✅ 任务完成: ${taskName}`)
}
} catch (error) {
console.error(` ❌ 任务异常: ${taskName}`, error.message)
taskFailedCount++
}
```
**修改位置**`src/stores/batchTaskStore.js` 第367-415行
---
## 🎯 修复效果
### 超时问题
| 并发数 | 超时时间 | 预期成功率 |
|-------|---------|-----------|
| 6个 | 10秒 | **0%** (全部超时) |
| 3个 | 20秒 | **70-90%** (预期) |
**说明**
- 并发数减半,服务器压力大幅降低
- 超时翻倍,给服务器更多处理时间
- 如果仍然超时可以进一步降低并发到2个或1个
### 统计问题
| 场景 | 修复前 | 修复后 |
|------|-------|-------|
| **6个全部失败** | `success: 6, failed: 0` ❌ | `success: 0, failed: 6` ✅ |
| **3个成功3个失败** | `success: 6, failed: 0` ❌ | `success: 3, failed: 3` ✅ |
| **6个全部成功** | `success: 6, failed: 0` ✅ | `success: 6, failed: 0` ✅ |
---
## 📊 技术细节
### 为什么不继续增加超时?
| 超时时间 | 优点 | 缺点 |
|---------|------|------|
| 5秒 | 快速失败,用户等待少 | 并发高时不够 |
| 10秒 | 平衡点v3.9.4 | 仍然不够 |
| 20秒 | 足够处理大部分情况 | 用户需要等待 |
| 30秒+ | 几乎不会超时 | 用户等待过久,体验差 |
**选择20秒的原因**
- 是10秒的2倍给服务器足够时间
- 用户可以接受的等待时间20秒 × 3个并发 = 约60秒总时间
- 如果20秒还不够问题可能在服务器端不应继续增加客户端超时
### 为什么降低默认并发到3个
| 并发数 | 服务器压力 | 总耗时假设每个账号20秒 | 适用场景 |
|-------|-----------|------------------------|---------|
| 1个 | 最低 | 120秒6 × 20 | 服务器极不稳定 |
| 2个 | 低 | 60秒3批 × 20 | 服务器不稳定 |
| **3个** | **适中** | **40秒2批 × 20** | **推荐** ✅ |
| 5个 | 高 | 40秒2批 × 20 | v3.9.4默认值 |
| 6个 | 很高 | 20秒1批 × 20 | 服务器稳定时 |
**选择3个的原因**
- 平衡并发效率和成功率
- 如果用户需要更高并发可以手动调整1-100可配置
- 新用户开箱即用,成功率高
### 任务结果检查逻辑
**关键判断**
```javascript
const isSuccess = result?.success !== false
```
这个判断覆盖了所有情况:
- `result = { success: true }` → `isSuccess = true` ✅
- `result = { success: false }` → `isSuccess = false` ❌
- `result = { data: {...} }` (没有success字段) → `isSuccess = true` ✅
- `result = undefined` → `isSuccess = true` ✅
- `result = null` → `isSuccess = true` ✅
**设计原则**
- 只有明确标记 `success: false` 才认为失败
- 其他情况默认认为成功(向后兼容旧代码)
---
## 🧪 验证方法
### 测试步骤
1. 重启开发服务器(如果正在运行)
2. 打开批量自动化面板
3. 选择 **6 个账号**
4. 只勾选 **"发车"** 任务
5. 点击 **"开始执行"**
### 预期结果(成功场景)
#### 日志输出
```
🚀 开始批量执行任务
📋 Token数量: 6
📋 任务列表: ['sendCar']
🎯 开始执行 Token: 802服-2-xxx (并发1/3)
🎯 开始执行 Token: 803服-0-xxx (并发2/3)
🎯 开始执行 Token: 803服-1-xxx (并发3/3)
⏳ Token token_xxx 将在 0.9秒 后建立连接 (剩余3个等待)
...
🚗 [token_xxx] 开始查询俱乐部车辆...
📤 发送消息: car_getrolecar {}
✅ [token_xxx] 查询到 4 辆车
...
✅ Token完成: 802服-2-xxx
✅ Token完成: 803服-0-xxx
✅ Token完成: 803服-1-xxx
🎯 开始执行 Token: 803服-2-xxx (并发1/3)
...
📊 统计信息: {total: 6, success: 6, failed: 0} ✅
✅ 所有任务成功完成!
```
#### UI显示
- ✅ 进度条显示正确
- ✅ 成功的Token卡片显示绿色
- ✅ 统计区域显示 `成功: 6, 失败: 0`
### 预期结果(失败场景)
#### 日志输出
```
🚗 [token_xxx] 开始查询俱乐部车辆...
❌ [token_xxx] 发车任务失败: Error: 请求超时: car_getrolecar (20000ms)
❌ 任务失败: sendCar 请求超时: car_getrolecar (20000ms)
❌ Token失败: 802服-2-xxx (所有任务都失败)
...
📊 统计信息: {total: 6, success: 0, failed: 6} ✅ 正确
❌ 批量任务执行完成,但有失败
```
#### UI显示
- ✅ 失败的Token卡片显示红色
- ✅ 统计区域显示 `成功: 0, 失败: 6`
- ✅ 全局统计正确
---
## 💡 后续优化建议
如果20秒超时 + 3个并发仍然不够超过30%失败率),可以考虑:
### 短期方案(用户可操作)
1. **降低并发数**手动调整到2个或1个
2. **使用自动重试**:勾选"自动重试失败任务"设置5轮重试
3. **错峰执行**:避开服务器高峰时段
### 长期方案(开发实施)
1. **完全串行执行模式**
- 添加"串行模式"开关
- 一个一个账号依次执行
- 保证100%成功率,但速度最慢
2. **智能并发调整**
- 根据失败率自动调整并发数
- 失败率 > 50% → 自动降低并发
- 成功率 > 90% → 自动提高并发
3. **请求队列机制**
- 在客户端实现请求队列
- 控制每秒最多发送N个请求
- 类似于限流Rate Limiting
4. **服务器端优化**(需要后端配合):
- 增加缓存
- 优化数据库查询
- 添加负载均衡
**目前不需要立即实施先观察v3.9.5的效果。**
---
## 🔄 版本信息
- **版本号**v3.9.5
- **修复日期**2025-10-08
- **影响范围**
- `src/stores/batchTaskStore.js`(超时配置、并发数、任务结果检查逻辑)
- **向后兼容**:✅ 完全兼容
- **破坏性变更**:❌ 无
---
## 📝 相关文档
- [批量任务添加发车功能 v3.9.0](./功能更新-批量任务添加发车功能v3.9.0.md)
- [发车任务超时和Vue组件警告 v3.9.3](./问题修复-发车任务超时和Vue组件警告v3.9.3.md)
- [发车任务超时优化 v3.9.4](./问题修复-发车任务超时优化v3.9.4.md)