Install
openclaw skills install http-retry-circuit-breakerImplements HTTP request retries with exponential backoff and a configurable circuit breaker to reduce failures and prevent cascading errors.
openclaw skills install http-retry-circuit-breakerImplements HTTP request retry strategies with circuit breaker pattern to improve reliability and reduce failure rates from 8% to 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
}
});
// Make request with automatic retry
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']
});
// Check circuit state
const state = client.getCircuitState(); // 'CLOSED', 'OPEN', or 'HALF-OPEN'
// Manually open/close circuit
client.openCircuit();
client.closeCircuit();
// Get statistics
const stats = client.getStats();
console.log(`Success rate: ${stats.successRate}%`);
console.log(`Failure rate: ${stats.failureRate}%`);
Delay between retries increases exponentially:
Adds randomization to prevent synchronized retries:
delay = baseDelay × (2 ^ attempt) × (0.5 + Math.random() * 0.5)
| Option | Type | Default | Description |
|---|---|---|---|
| maxRetries | number | 3 | Maximum retry attempts |
| baseDelay | number | 1000 | Initial delay in ms |
| maxDelay | number | 30000 | Maximum delay in ms |
| multiplier | number | 2 | Backoff multiplier |
| jitter | number | 0.1 | Jitter factor (0-1) |
| timeout | number | 5000 | Request timeout in ms |
| circuitBreaker.failureThreshold | number | 5 | Failures to open circuit |
| circuitBreaker.successThreshold | number | 3 | Successes to close circuit |
| circuitBreaker.resetTimeout | number | 30000 | Time before HALF-OPEN |
| circuitBreaker.halfOpenMaxRequests | number | 3 | Max requests in HALF-OPEN |
client.on('retry', (attempt, error) => {
console.log(`Retry attempt ${attempt} due to: ${error.message}`);
});
client.on('circuitOpen', () => {
console.log('Circuit breaker opened');
});
client.on('circuitHalfOpen', () => {
console.log('Circuit breaker half-open');
});
client.on('circuitClose', () => {
console.log('Circuit breaker closed');
});
try {
const response = await client.get('https://api.example.com/data');
} catch (error) {
if (error.code === 'CIRCUIT_OPEN') {
console.log('Service temporarily unavailable');
} else if (error.code === 'MAX_RETRIES') {
console.log('All retry attempts failed');
} else {
console.error('Request failed:', error);
}
}
npm test
MIT