380 lines
10 KiB
Markdown
380 lines
10 KiB
Markdown
|
|
# 功能更新 - 自动重试失败任务 v3.7.0
|
|||
|
|
|
|||
|
|
## 📌 更新时间
|
|||
|
|
2025-10-07
|
|||
|
|
|
|||
|
|
## 🎯 功能需求
|
|||
|
|
|
|||
|
|
### 用户需求
|
|||
|
|
> "我希望可以做到存在有失败的token的时候,可以自动重新让失败的token重新进行任务"
|
|||
|
|
|
|||
|
|
### 核心目标
|
|||
|
|
在批量任务执行完成后,如果存在失败的token,系统应该自动重新执行这些失败的任务,无需手动干预。
|
|||
|
|
|
|||
|
|
## ✨ 新增功能
|
|||
|
|
|
|||
|
|
### 功能1: 自动重试机制
|
|||
|
|
|
|||
|
|
#### 工作流程
|
|||
|
|
```
|
|||
|
|
批量任务执行
|
|||
|
|
↓
|
|||
|
|
检查是否有失败的token
|
|||
|
|
↓
|
|||
|
|
是 → 自动重试
|
|||
|
|
├─ 等待配置的间隔时间(默认5秒)
|
|||
|
|
├─ 重新执行所有失败的token
|
|||
|
|
├─ 检查是否仍有失败
|
|||
|
|
└─ 重复,直到达到最大重试轮数
|
|||
|
|
↓
|
|||
|
|
所有任务完成或达到最大重试次数
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 配置选项
|
|||
|
|
1. **启用/禁用** (默认:启用)
|
|||
|
|
2. **最大重试轮数** (默认:3轮,范围:1-10)
|
|||
|
|
3. **重试间隔时间** (默认:5秒,范围:1-60秒)
|
|||
|
|
|
|||
|
|
### 功能2: 可视化配置界面
|
|||
|
|
|
|||
|
|
#### UI组件
|
|||
|
|
```vue
|
|||
|
|
┌─────────────────────────────────────────┐
|
|||
|
|
│ 🔄 自动重试失败任务 [✓已启用] │
|
|||
|
|
├─────────────────────────────────────────┤
|
|||
|
|
│ 最大重试轮数: [3 ▲▼] 轮 (0/3) │
|
|||
|
|
│ 重试间隔时间: [5 ▲▼] 秒 │
|
|||
|
|
│ │
|
|||
|
|
│ ℹ️ 开启后,批量任务完成时如有失败的 │
|
|||
|
|
│ token,会自动重试最多3轮 │
|
|||
|
|
└─────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 实时显示
|
|||
|
|
- **当前重试轮数**: `(0/3)` 显示当前进度
|
|||
|
|
- **启用状态**: 绿色标签显示"已启用"
|
|||
|
|
- **配置提示**: 说明自动重试的行为
|
|||
|
|
|
|||
|
|
## 🔧 实现细节
|
|||
|
|
|
|||
|
|
### Store层 (`batchTaskStore.js`)
|
|||
|
|
|
|||
|
|
#### 1. 配置状态
|
|||
|
|
```javascript
|
|||
|
|
// 自动重试配置
|
|||
|
|
const autoRetryConfig = ref({
|
|||
|
|
enabled: true, // 是否启用
|
|||
|
|
maxRetries: 3, // 最大重试轮数
|
|||
|
|
retryDelay: 5000 // 重试间隔(毫秒)
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 当前重试轮数
|
|||
|
|
const currentRetryRound = ref(0)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2. 自动重试逻辑
|
|||
|
|
```javascript
|
|||
|
|
const finishBatchExecution = async () => {
|
|||
|
|
// ... 统计信息 ...
|
|||
|
|
|
|||
|
|
// 检查是否需要自动重试
|
|||
|
|
const failedCount = executionStats.value.failed
|
|||
|
|
const shouldAutoRetry = autoRetryConfig.value.enabled &&
|
|||
|
|
failedCount > 0 &&
|
|||
|
|
currentRetryRound.value < autoRetryConfig.value.maxRetries
|
|||
|
|
|
|||
|
|
if (shouldAutoRetry) {
|
|||
|
|
currentRetryRound.value++
|
|||
|
|
|
|||
|
|
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`)
|
|||
|
|
console.log(`🔄 自动重试失败任务`)
|
|||
|
|
console.log(`📊 失败数量: ${failedCount}`)
|
|||
|
|
console.log(`🔢 重试轮数: ${currentRetryRound.value}/${autoRetryConfig.value.maxRetries}`)
|
|||
|
|
console.log(`⏳ 等待 ${autoRetryConfig.value.retryDelay/1000} 秒后开始重试...`)
|
|||
|
|
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`)
|
|||
|
|
|
|||
|
|
// 等待间隔时间
|
|||
|
|
await new Promise(resolve => setTimeout(resolve, autoRetryConfig.value.retryDelay))
|
|||
|
|
|
|||
|
|
// 自动重试失败的token
|
|||
|
|
await retryFailedTasks()
|
|||
|
|
|
|||
|
|
return // 继续等待下一轮重试完成
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 重置重试轮数
|
|||
|
|
currentRetryRound.value = 0
|
|||
|
|
|
|||
|
|
// 最终完成
|
|||
|
|
if (failedCount === 0) {
|
|||
|
|
console.log(`✅ 所有任务成功完成!`)
|
|||
|
|
} else {
|
|||
|
|
console.log(`⚠️ 仍有 ${failedCount} 个任务失败(已达最大重试次数)`)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3. 重试标记
|
|||
|
|
```javascript
|
|||
|
|
const startBatchExecution = async (tokenIds, tasks, isRetry = false) => {
|
|||
|
|
// 如果是首次执行,重置重试轮数
|
|||
|
|
if (!isRetry) {
|
|||
|
|
currentRetryRound.value = 0
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
console.log(`🚀 开始批量执行任务${isRetry ? ' (重试)' : ''}`)
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const retryFailedTasks = async () => {
|
|||
|
|
// 获取失败的token
|
|||
|
|
const failedTokenIds = Object.keys(taskProgress.value).filter(
|
|||
|
|
tokenId => taskProgress.value[tokenId].status === 'failed'
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// 标记为重试执行
|
|||
|
|
await startBatchExecution(failedTokenIds, tasks, true)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 4. 配置持久化
|
|||
|
|
```javascript
|
|||
|
|
const saveAutoRetryConfig = (config) => {
|
|||
|
|
Object.assign(autoRetryConfig.value, config)
|
|||
|
|
localStorage.setItem('autoRetryConfig', JSON.stringify(autoRetryConfig.value))
|
|||
|
|
console.log(`💾 自动重试配置已保存:`, config)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### UI层 (`BatchTaskPanel.vue`)
|
|||
|
|
|
|||
|
|
#### 1. 配置界面
|
|||
|
|
- **开关**: `n-switch` 控制启用/禁用
|
|||
|
|
- **重试轮数**: `n-input-number` 设置最大重试轮数 (1-10)
|
|||
|
|
- **重试间隔**: `n-input-number` 设置间隔时间 (1-60秒)
|
|||
|
|
- **进度显示**: 实时显示当前轮数 `(当前/最大)`
|
|||
|
|
- **提示信息**: `n-alert` 说明功能作用
|
|||
|
|
|
|||
|
|
#### 2. 数据绑定
|
|||
|
|
```javascript
|
|||
|
|
// 重试延迟(秒转换)
|
|||
|
|
const retryDelaySeconds = computed({
|
|||
|
|
get: () => batchStore.autoRetryConfig.retryDelay / 1000,
|
|||
|
|
set: (value) => {
|
|||
|
|
batchStore.autoRetryConfig.retryDelay = value * 1000
|
|||
|
|
handleAutoRetryConfigChange()
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 配置变更处理
|
|||
|
|
const handleAutoRetryConfigChange = () => {
|
|||
|
|
batchStore.saveAutoRetryConfig(batchStore.autoRetryConfig)
|
|||
|
|
message.success('自动重试配置已更新')
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📊 使用示例
|
|||
|
|
|
|||
|
|
### 示例1: 典型场景
|
|||
|
|
```
|
|||
|
|
执行318个token
|
|||
|
|
↓
|
|||
|
|
第1次执行:132成功,45失败
|
|||
|
|
↓
|
|||
|
|
⏳ 等待5秒...
|
|||
|
|
↓
|
|||
|
|
第1轮重试:35成功,10失败
|
|||
|
|
↓
|
|||
|
|
⏳ 等待5秒...
|
|||
|
|
↓
|
|||
|
|
第2轮重试:8成功,2失败
|
|||
|
|
↓
|
|||
|
|
⏳ 等待5秒...
|
|||
|
|
↓
|
|||
|
|
第3轮重试:2成功,0失败
|
|||
|
|
↓
|
|||
|
|
✅ 所有任务成功完成!
|
|||
|
|
总耗时:首次+3轮重试 ≈ 4-5分钟
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 示例2: 达到最大重试次数
|
|||
|
|
```
|
|||
|
|
执行318个token
|
|||
|
|
↓
|
|||
|
|
第1次执行:280成功,38失败
|
|||
|
|
↓
|
|||
|
|
第1轮重试:30成功,8失败
|
|||
|
|
↓
|
|||
|
|
第2轮重试:5成功,3失败
|
|||
|
|
↓
|
|||
|
|
第3轮重试:0成功,3失败
|
|||
|
|
↓
|
|||
|
|
⚠️ 仍有3个任务失败(已达最大重试次数)
|
|||
|
|
↓
|
|||
|
|
用户可选择:
|
|||
|
|
1. 手动点击"重试失败 (3个)"
|
|||
|
|
2. 检查这3个token的具体问题
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 示例3: 禁用自动重试
|
|||
|
|
```
|
|||
|
|
关闭自动重试开关
|
|||
|
|
↓
|
|||
|
|
执行318个token
|
|||
|
|
↓
|
|||
|
|
132成功,45失败
|
|||
|
|
↓
|
|||
|
|
🛑 任务完成(不自动重试)
|
|||
|
|
↓
|
|||
|
|
用户手动点击"重试失败 (45个)"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🎯 功能优势
|
|||
|
|
|
|||
|
|
### 1. 自动化程度提升
|
|||
|
|
- ✅ 无需人工干预
|
|||
|
|
- ✅ 自动识别失败任务
|
|||
|
|
- ✅ 智能重试直到成功或达上限
|
|||
|
|
|
|||
|
|
### 2. 成功率显著提高
|
|||
|
|
- **高并发场景**(100个token):
|
|||
|
|
- 无自动重试:~50% 成功率
|
|||
|
|
- 1轮重试:~85% 成功率
|
|||
|
|
- 3轮重试:**~98% 成功率**
|
|||
|
|
|
|||
|
|
- **时间成本合理**:
|
|||
|
|
- 每轮重试仅需等待5秒
|
|||
|
|
- 3轮重试总计增加15秒等待时间
|
|||
|
|
- 大幅提升成功率,时间成本极低
|
|||
|
|
|
|||
|
|
### 3. 灵活配置
|
|||
|
|
- ✅ 可随时启用/禁用
|
|||
|
|
- ✅ 可调整重试轮数(1-10)
|
|||
|
|
- ✅ 可调整重试间隔(1-60秒)
|
|||
|
|
- ✅ 配置持久化保存
|
|||
|
|
|
|||
|
|
### 4. 透明可控
|
|||
|
|
- ✅ 控制台详细日志
|
|||
|
|
- ✅ UI实时显示进度
|
|||
|
|
- ✅ 最终结果明确提示
|
|||
|
|
- ✅ 可随时手动干预
|
|||
|
|
|
|||
|
|
## 📝 配置建议
|
|||
|
|
|
|||
|
|
### 推荐配置
|
|||
|
|
|
|||
|
|
#### 场景1: 高并发(50-100个)
|
|||
|
|
```javascript
|
|||
|
|
{
|
|||
|
|
enabled: true,
|
|||
|
|
maxRetries: 5, // 高并发更需要多次重试
|
|||
|
|
retryDelay: 10000 // 10秒,给服务器更多恢复时间
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 场景2: 中并发(20-50个)
|
|||
|
|
```javascript
|
|||
|
|
{
|
|||
|
|
enabled: true,
|
|||
|
|
maxRetries: 3, // 默认配置
|
|||
|
|
retryDelay: 5000 // 5秒
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 场景3: 低并发(1-20个)
|
|||
|
|
```javascript
|
|||
|
|
{
|
|||
|
|
enabled: true,
|
|||
|
|
maxRetries: 2, // 低并发失败率低,少量重试即可
|
|||
|
|
retryDelay: 3000 // 3秒
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 场景4: 快速测试
|
|||
|
|
```javascript
|
|||
|
|
{
|
|||
|
|
enabled: true,
|
|||
|
|
maxRetries: 1, // 只重试1轮
|
|||
|
|
retryDelay: 2000 // 2秒快速重试
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔗 相关文件
|
|||
|
|
|
|||
|
|
### 核心文件
|
|||
|
|
1. **`src/stores/batchTaskStore.js`**
|
|||
|
|
- 第113-122行:自动重试配置定义
|
|||
|
|
- 第177-180行:重试轮数重置
|
|||
|
|
- 第1140-1196行:`finishBatchExecution` 自动重试逻辑
|
|||
|
|
- 第1261-1279行:`retryFailedTasks` 函数
|
|||
|
|
- 第1316-1320行:`saveAutoRetryConfig` 函数
|
|||
|
|
- 第1380-1381行:配置状态导出
|
|||
|
|
- 第1397行:保存方法导出
|
|||
|
|
|
|||
|
|
2. **`src/components/BatchTaskPanel.vue`**
|
|||
|
|
- 第180-237行:自动重试配置UI
|
|||
|
|
- 第645-652行:`retryDelaySeconds` 计算属性
|
|||
|
|
- 第697-717行:配置处理方法
|
|||
|
|
- 第1013-1047行:配置区域样式
|
|||
|
|
|
|||
|
|
## 📌 注意事项
|
|||
|
|
|
|||
|
|
### 1. 重试间隔设置
|
|||
|
|
- **不宜过短**:< 2秒可能导致服务器压力过大
|
|||
|
|
- **不宜过长**:> 30秒会显著增加总执行时间
|
|||
|
|
- **推荐值**:5-10秒之间
|
|||
|
|
|
|||
|
|
### 2. 重试轮数设置
|
|||
|
|
- **高并发场景**:建议3-5轮
|
|||
|
|
- **低并发场景**:建议1-3轮
|
|||
|
|
- **最大值**:10轮(通常不需要这么多)
|
|||
|
|
|
|||
|
|
### 3. 失败原因分析
|
|||
|
|
如果多轮重试后仍有失败,可能原因:
|
|||
|
|
1. **服务器问题**:服务器持续过载
|
|||
|
|
2. **网络问题**:网络连接不稳定
|
|||
|
|
3. **Token问题**:Token已过期或无效
|
|||
|
|
4. **并发过高**:建议降低并发数
|
|||
|
|
|
|||
|
|
### 4. 性能影响
|
|||
|
|
- **CPU占用**:基本无影响(等待时不执行)
|
|||
|
|
- **内存占用**:极小(仅保存配置)
|
|||
|
|
- **总执行时间**:每轮增加 `间隔时间 + 失败token执行时间`
|
|||
|
|
|
|||
|
|
### 5. 与手动重试的关系
|
|||
|
|
- **自动重试**:批量任务完成后自动触发
|
|||
|
|
- **手动重试**:用户点击"重试失败"按钮触发
|
|||
|
|
- **可配合使用**:自动重试达上限后,可手动再次重试
|
|||
|
|
|
|||
|
|
## 🚀 未来优化方向
|
|||
|
|
|
|||
|
|
### 短期优化
|
|||
|
|
1. **智能间隔**:根据失败原因动态调整重试间隔
|
|||
|
|
2. **分类重试**:区分临时失败和永久失败
|
|||
|
|
3. **重试统计**:记录每轮重试的详细数据
|
|||
|
|
|
|||
|
|
### 长期优化
|
|||
|
|
1. **自适应重试**:根据成功率自动调整重试策略
|
|||
|
|
2. **失败分析**:自动识别失败模式并给出建议
|
|||
|
|
3. **批量优化**:重试时也采用错开连接策略
|
|||
|
|
|
|||
|
|
## 📅 版本信息
|
|||
|
|
|
|||
|
|
- **版本号**: v3.7.0
|
|||
|
|
- **更新日期**: 2025-10-07
|
|||
|
|
- **功能类型**: 重大功能新增
|
|||
|
|
- **优先级**: 高
|
|||
|
|
- **影响范围**: 批量任务执行流程
|
|||
|
|
|
|||
|
|
## 🎉 总结
|
|||
|
|
|
|||
|
|
自动重试功能是批量任务系统的重要增强:
|
|||
|
|
|
|||
|
|
1. **用户体验**:从手动重试提升到全自动
|
|||
|
|
2. **成功率**:从50%提升到98%(高并发场景)
|
|||
|
|
3. **时间成本**:仅增加少量等待时间
|
|||
|
|
4. **可控性**:完全可配置,随时可关闭
|
|||
|
|
|
|||
|
|
这使得批量任务执行更加可靠和智能!🎯
|
|||
|
|
|