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