150 lines
3.4 KiB
Markdown
150 lines
3.4 KiB
Markdown
# 网络连接问题解决方案
|
||
|
||
## 问题描述
|
||
|
||
在产品同步过程中遇到 `ECONNRESET` 错误,导致同步失败。
|
||
|
||
## 错误分析
|
||
|
||
### ECONNRESET 错误原因
|
||
|
||
`ECONNRESET` 是一个网络连接重置错误,通常由以下原因引起:
|
||
|
||
1. **服务器主动断开连接**
|
||
- 服务器负载过高
|
||
- 服务器配置的连接超时
|
||
- 服务器重启或维护
|
||
|
||
2. **网络不稳定**
|
||
- 网络延迟过高
|
||
- 网络丢包
|
||
- 防火墙或代理干预
|
||
|
||
3. **SSL/TLS 握手问题**
|
||
- 证书验证失败
|
||
- SSL 协议版本不匹配
|
||
|
||
4. **客户端配置问题**
|
||
- 请求频率过高
|
||
- 缺少适当的重试机制
|
||
- 连接池配置不当
|
||
|
||
## 解决方案
|
||
|
||
### 1. 添加重试机制
|
||
|
||
```typescript
|
||
// 重试配置
|
||
const maxRetries = 3;
|
||
const retryDelay = 1000; // 1秒
|
||
|
||
// 指数退避重试
|
||
const delay = retryDelay * Math.pow(2, retryCount - 1);
|
||
await new Promise(resolve => setTimeout(resolve, delay));
|
||
```
|
||
|
||
### 2. 优化网络请求配置
|
||
|
||
```typescript
|
||
const config: AxiosRequestConfig = {
|
||
method: 'GET',
|
||
url: `${wpApiUrl}/wp-json${endpoint}`,
|
||
headers: {
|
||
Authorization: `Basic ${auth}`,
|
||
'Connection': 'keep-alive',
|
||
'User-Agent': 'API-Client/1.0'
|
||
},
|
||
// 添加超时配置
|
||
timeout: 30000, // 30秒超时
|
||
// 优化SSL配置
|
||
httpsAgent: new (require('https').Agent)({
|
||
rejectUnauthorized: false, // 仅用于开发环境
|
||
keepAlive: true,
|
||
keepAliveMsecs: 1000,
|
||
maxSockets: 5,
|
||
maxFreeSockets: 2
|
||
}),
|
||
};
|
||
```
|
||
|
||
### 3. 错误处理和日志记录
|
||
|
||
```typescript
|
||
try {
|
||
const response = await axios.request(config);
|
||
// 处理成功响应
|
||
} catch (error) {
|
||
if (error.code === 'ECONNRESET' || error.code === 'ETIMEDOUT' || error.code === 'ENOTFOUND') {
|
||
console.warn(`网络连接错误 (${error.code}),第 ${retryCount} 次重试...`);
|
||
// 重试逻辑
|
||
} else {
|
||
console.error(`获取数据失败:`, error.message);
|
||
throw new Error(`网络请求失败: ${error.message}`);
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4. 请求频率控制
|
||
|
||
```typescript
|
||
// 添加页面间的延迟,避免过于频繁的请求
|
||
if (hasMore) {
|
||
await new Promise(resolve => setTimeout(resolve, 200));
|
||
}
|
||
```
|
||
|
||
## 最佳实践
|
||
|
||
### 1. 连接池优化
|
||
|
||
- 使用 `keepAlive: true` 保持连接复用
|
||
- 合理设置 `maxSockets` 和 `maxFreeSockets`
|
||
- 避免创建过多并发连接
|
||
|
||
### 2. 超时配置
|
||
|
||
- 设置合理的请求超时时间(建议 30-60 秒)
|
||
- 根据网络环境调整超时参数
|
||
|
||
### 3. 重试策略
|
||
|
||
- 使用指数退避算法
|
||
- 限制最大重试次数
|
||
- 只对特定错误类型进行重试
|
||
|
||
### 4. 错误监控
|
||
|
||
- 记录详细的错误日志
|
||
- 监控网络请求成功率
|
||
- 设置告警机制
|
||
|
||
## 代码实现
|
||
|
||
已在 `wp.service.ts` 的 `fetchPagedData` 方法中实现以下改进:
|
||
|
||
1. ✅ 添加重试机制(最多重试3次)
|
||
2. ✅ 实现指数退避算法
|
||
3. ✅ 优化 HTTPS Agent 配置
|
||
4. ✅ 添加请求超时设置
|
||
5. ✅ 改进错误处理和日志记录
|
||
6. ✅ 添加请求间隔控制
|
||
|
||
## 预期效果
|
||
|
||
- 减少因网络波动导致的同步失败
|
||
- 提高产品同步的成功率和稳定性
|
||
- 提供更好的错误信息和调试支持
|
||
- 避免对服务器造成过大压力
|
||
|
||
## 监控建议
|
||
|
||
1. 监控重试次数和成功率
|
||
2. 记录网络错误的发生频率
|
||
3. 观察同步任务的完成时间
|
||
4. 设置异常告警机制
|
||
|
||
## 注意事项
|
||
|
||
- 开发环境中使用 `rejectUnauthorized: false`,生产环境应移除
|
||
- 根据实际网络环境调整超时和重试参数
|
||
- 定期检查和更新网络配置 |