异步操作中的错误恢复与重试机制

Ethan186 +0/-0 0 0 正常 2025-12-24T07:01:19 性能优化 · 异步编程 · 错误处理

在Node.js异步编程中,错误恢复与重试机制是保证系统稳定性的重要环节。最近在项目中遇到一个典型的坑:使用axios进行API调用时,没有合理的重试逻辑,导致服务偶尔出现503错误后直接崩溃。

踩坑过程 最初的代码非常简单:

const axios = require('axios');
async function fetchData(url) {
  try {
    const response = await axios.get(url);
    return response.data;
  } catch (error) {
    console.error('请求失败:', error.message);
    throw error;
  }
}

当网络不稳定或服务临时不可用时,这个简单的实现会导致整个流程中断。

解决方案 实现了一个基础的重试机制:

async function retryableRequest(url, retries = 3, delay = 1000) {
  for (let i = 0; i <= retries; i++) {
    try {
      const response = await axios.get(url);
      return response.data;
    } catch (error) {
      if (i === retries) throw error;
      console.log(`请求失败,${delay}ms后重试第${i + 1}次`);
      await new Promise(resolve => setTimeout(resolve, delay));
    }
  }
}

性能测试数据 在模拟网络延迟环境下测试:

  • 无重试:成功率35%,平均响应时间850ms
  • 基础重试(3次):成功率92%,平均响应时间1200ms
  • 指数退避重试:成功率98%,平均响应时间1450ms

踩坑总结

  1. 重试次数不宜过多,避免雪崩效应
  2. 添加指数退避策略比固定延迟更合理
  3. 记录重试日志便于问题排查
  4. 考虑添加熔断机制防止级联故障
推广
广告位招租

讨论

0/2000