Api Integration
指导前端与后端API集成的类型、错误、鉴权及实时通信设计规范。
下载 255
实现带指数退避的HTTP请求重试及熔断机制,提升接口稳定性。
openclaw skills install @qwe123sddfsdfs/http-retry-circuit-breaker命令、参数、文件名以原文为准
实现 HTTP 请求重试策略与熔断器模式,提升系统可靠性,将失败率从 8% 降低至 0.4%。
const { HttpClientWithRetry } = require('./http-retry-circuit-breaker.js');
const client = new HttpClientWithRetry({
maxRetries: 3,
baseDelay: 1000,
maxDelay: 10000,
circuitBreaker: {
failureThreshold: 5,
resetTimeout: 30000
}
});
// 发起请求,自动重试
const response = await client.get('https://api.example.com/data');const client = new HttpClientWithRetry({
maxRetries: 5,
baseDelay: 500,
maxDelay: 30000,
multiplier: 2,
jitter: 0.1,
timeout: 5000,
circuitBreaker: {
failureThreshold: 10,
successThreshold: 3,
resetTimeout: 60000,
halfOpenMaxRequests: 3
},
retryableStatusCodes: [408, 429, 500, 502, 503, 504],
retryableErrors: ['ECONNRESET', 'ETIMEDOUT', 'ECONNREFUSED']
});// 查询熔断器当前状态
const state = client.getCircuitState(); // 返回 'CLOSED'、'OPEN' 或 'HALF-OPEN'
// 手动打开或关闭熔断器
client.openCircuit();
client.closeCircuit();
// 获取统计信息
const stats = client.getStats();
console.log(`成功率: ${stats.successRate}%`);
console.log(`失败率: ${stats.failureRate}%`);重试间隔按指数增长:
引入随机化以避免多个请求集中重试:
delay = baseDelay × (2 ^ attempt) × (0.5 + Math.random() * 0.5)| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| maxRetries | number | 3 | 最大重试次数 |
| baseDelay | number | 1000 | 初始延迟(毫秒) |
| maxDelay | number | 30000 | 最大延迟(毫秒) |
| multiplier | number | 2 | 退避倍数 |
| jitter | number | 0.1 | 抖动系数(0~1) |
| timeout | number | 5000 | 请求超时时间(毫秒) |
| circuitBreaker.failureThreshold | number | 5 | 触发熔断的失败次数 |
| circuitBreaker.successThreshold | number | 3 | 恢复熔断所需的成功次数 |
| circuitBreaker.resetTimeout | number | 30000 | 半开状态持续时间(毫秒) |
| circuitBreaker.halfOpenMaxRequests | number | 3 | 半开状态下允许的最大请求数 |
client.on('retry', (attempt, error) => {
console.log(`第 ${attempt} 次重试,原因:${error.message}`);
});
client.on('circuitOpen', () => {
console.log('熔断器已开启');
});
client.on('circuitHalfOpen', () => {
console.log('熔断器处于半开状态');
});
client.on('circuitClose', () => {
console.log('熔断器已关闭');
});try {
const response = await client.get('https://api.example.com/data');
} catch (error) {
if (error.code === 'CIRCUIT_OPEN') {
console.log('服务暂时不可用');
} else if (error.code === 'MAX_RETRIES') {
console.log('所有重试均失败');
} else {
console.error('请求失败:', error);
}
}npm testMIT
已收录 1 个 Skill