HTTP Retry Circuit Breaker

实现带指数退避的HTTP请求重试及熔断机制,提升接口稳定性。

已扫描
适合谁
后端开发工程师、API集成开发者
不适合谁
无编程基础的普通用户、仅需简单网页操作的用户
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
中等(★★☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @qwe123sddfsdfs/http-retry-circuit-breaker

Skill 说明

命令、参数、文件名以原文为准

HTTP 重试 + 熔断器技能

描述

实现 HTTP 请求重试策略与熔断器模式,提升系统可靠性,将失败率从 8% 降低至 0.4%。

适用场景

  • 向不稳定的外部服务发起 HTTP 请求
  • 需要在瞬时故障时自动重试
  • 希望通过熔断器防止级联故障
  • 降低 API 失败率

功能特性

  • 指数退避重试:智能重试机制,延迟逐步增加
  • 熔断器模式:支持三种状态(CLOSED、OPEN、HALF-OPEN)
  • 失败率监控:实时跟踪请求成功率与失败率
  • 可配置阈值:可自定义重试次数、超时时间、失败阈值等参数
  • 抖动支持:防止多个请求同时重试导致的“雷击效应”

使用方法

基础示例

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}%`);

重试策略

指数退避

重试间隔按指数增长:

  • 第 1 次尝试:baseDelay(例如 1 秒)
  • 第 2 次尝试:baseDelay × 2(例如 2 秒)
  • 第 3 次尝试:baseDelay × 4(例如 4 秒)
  • 第 4 次尝试:baseDelay × 8(例如 8 秒)

带抖动的退避

引入随机化以避免多个请求集中重试:

delay = baseDelay × (2 ^ attempt) × (0.5 + Math.random() * 0.5)

熔断器状态

CLOSED(正常运行)

  • 请求正常通过
  • 记录失败情况
  • 当失败次数超过阈值时进入 OPEN 状态

OPEN(快速失败)

  • 请求立即失败,不再尝试
  • 防止对已故障服务造成过载
  • 在 resetTimeout 时间后自动切换为 HALF-OPEN

HALF-OPEN(试探阶段)

  • 允许有限数量的请求通过
  • 成功则恢复为 CLOSED
  • 失败则重新回到 OPEN 状态

性能影响

之前(无重试/熔断器)

  • 失败率:约 8%
  • 存在级联故障风险
  • 无自动恢复机制

之后(启用重试 + 熔断器)

  • 失败率:约 0.4%(降低 95%)
  • 支持自动恢复
  • 有效防止级联故障
  • 提升用户体验

配置选项

参数类型默认值说明
maxRetriesnumber3最大重试次数
baseDelaynumber1000初始延迟(毫秒)
maxDelaynumber30000最大延迟(毫秒)
multipliernumber2退避倍数
jitternumber0.1抖动系数(0~1)
timeoutnumber5000请求超时时间(毫秒)
circuitBreaker.failureThresholdnumber5触发熔断的失败次数
circuitBreaker.successThresholdnumber3恢复熔断所需的成功次数
circuitBreaker.resetTimeoutnumber30000半开状态持续时间(毫秒)
circuitBreaker.halfOpenMaxRequestsnumber3半开状态下允许的最大请求数

事件监听

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 test

许可证

MIT

Q
@qwe123sddfsdfs

已收录 1 个 Skill

相关推荐