You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Express应用中实现断路器与重试策略?附代码示例

认知纠正与Express断路器+重试实现示例

先纠正你的认知偏差

  • Polly.js:不止能做重试。它核心是服务虚拟化(录制/回放请求),但内置了重试、断路器等全套容错策略,能通过配置同时启用两者,还支持多种适配器适配不同请求场景。
  • Opossum:不止能做断路器。它的断路器组件可以直接配置重试逻辑,支持设置重试次数、延迟间隔等参数,能在断路器的生命周期内无缝集成重试策略,不用额外依赖其他重试库。

Express端点实现断路器+重试的代码示例

这里用Opossum来实现,因为它对Express场景的适配更简洁,轻量且直接。

1. 先装依赖

npm install opossum express

2. 完整代码

const express = require('express');
const CircuitBreaker = require('opossum');

const app = express();
app.use(express.json());

// 模拟一个可能失败的业务逻辑(比如调用外部服务、数据库操作)
const riskyOperation = async (req) => {
  // 模拟30%的失败概率,用来测试容错逻辑
  if (Math.random() < 0.3) {
    throw new Error('Service unavailable');
  }
  return { data: `Handled request: ${req.body.content}` };
};

// 配置断路器+重试的参数
const breakerConfig = {
  timeout: 3000,          // 请求超时时间(3秒)
  errorThresholdPercentage: 50, // 错误率超过50%时触发断路
  resetTimeout: 10000,    // 断路后10秒尝试恢复
  retry: true,            // 开启重试
  retryDelay: 1000,       // 每次重试间隔1秒
  maxRetryAttempts: 2     // 最多重试2次(算上首次共3次请求)
};

// 创建断路器实例,绑定业务逻辑
const breaker = new CircuitBreaker(riskyOperation, breakerConfig);

// 可选:监听断路器状态变更,方便日志排查
breaker.on('open', () => console.log('[Circuit Breaker] 已打开,拒绝新请求'));
breaker.on('close', () => console.log('[Circuit Breaker] 已关闭,恢复正常'));
breaker.on('halfOpen', () => console.log('[Circuit Breaker] 半开状态,尝试恢复'));
breaker.on('failure', (err) => console.log('[Request Failed]', err.message));
breaker.on('success', (res) => console.log('[Request Succeeded]', JSON.stringify(res)));

// 定义Express端点,用断路器处理请求
app.post('/api/handle', async (req, res) => {
  try {
    const result = await breaker.fire(req);
    res.status(200).json(result);
  } catch (err) {
    // 断路器打开或所有重试都失败时返回503
    res.status(503).json({ error: '服务暂时不可用,请稍后重试' });
  }
});

// 启动服务
app.listen(3000, () => {
  console.log('服务运行在 http://localhost:3000');
});

代码说明

  • riskyOperation:模拟可能失败的业务逻辑,比如调用外部API、数据库查询,这里用随机失败来测试容错效果。
  • 断路器配置里,通过retry: true开启重试,配合retryDelay和maxRetryAttempts定义重试规则;同时设置了断路触发的错误阈值和恢复时间。
  • 当错误率超过50%时,断路器会进入打开状态,直接拒绝所有新请求;10秒后进入半开状态,尝试处理少量请求,若成功则恢复正常(关闭状态),否则继续保持打开。
  • 端点/api/handle通过breaker.fire(req)把请求交给断路器处理,自动完成重试和断路逻辑,不用在业务代码里重复写容错逻辑。

Polly.js的实现思路补充

如果更倾向用Polly.js,它可以通过组合RetryPolicy和CircuitBreakerPolicy来实现,不过Polly更偏向于拦截HTTP请求(比如调用外部服务的场景),对于Express内部业务逻辑的容错,Opossum会更轻量。简单示例如下:

const { Polly } = require('@pollyjs/core');
const NodeHttpAdapter = require('@pollyjs/adapter-node-http');

Polly.register(NodeHttpAdapter);

// 创建Polly实例,同时启用重试和断路器
const polly = new Polly('express-service', {
  adapters: ['node-http'],
  retry: {
    enabled: true,
    maxRetries: 2,
    delay: 1000
  },
  circuitBreaker: {
    enabled: true,
    failureThreshold: 0.5,
    resetTimeout: 10000
  }
});

app.post('/api/handle', async (req, res) => {
  try {
    // 这里假设是调用外部服务,Polly会自动拦截并应用重试+断路器
    const response = await fetch('https://external-service/api', {
      method: 'POST',
      body: JSON.stringify(req.body),
      headers: { 'Content-Type': 'application/json' }
    });
    const data = await response.json();
    res.status(200).json(data);
  } catch (err) {
    res.status(503).json({ error: '服务暂时不可用' });
  } finally {
    await polly.stop();
  }
});

内容的提问来源于stack exchange,提问作者Hmmmmm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:26:01