자바스크립트로 API 재시도 전략 구현하기

우동이·2024년 7월 18일
1

JavaScript

목록 보기
3/9

Exponential Backoff

  • API 요청 후 에러가 발생하면 재요청할 때 재시도 횟수에 따라 지연 시간이 점차 증가합니다.
const axios = require("axios");

let errorCount = 0; // 시도 횟수 추적

const fetchData = async (url, retries, delay) => {
  try {
    errorCount++;

    // 강제 에러 발생 시키기
    if (errorCount <= 2) {
      throw new Error("Network request failed");
    }

    const response = await axios.get(url);

    return response.data;
  } catch (error) {

    // 재시도 횟수가 남아 있으면 API 재요청
    if (retries > 0) {
      // 딜레이
      await new Promise((resolve) => setTimeout(resolve, delay));

      // 재시도 요청 딜레이를 증가 시킴 => Exponential Backoff 전략
      return fetchData(url, retries - 1, delay * 2);
    } else {
      throw new Error("All retries failed");
    }
  }
};

Linear Backoff

  • API 요청 후 에러가 발생하면, API를 재요청할 때 사용자가 설정한 값에 따라 지연 시간이 일정하게 증가합니다.
const axios = require("axios");

let errorCount = 0;

const fetchData = async (url, retries, delay, increment) => {
  try {
    errorCount++;
    
    // 강제 에러 발생 시키기
    if (errorCount <= 2) {
      throw new Error("Network request failed");
    }

    const response = await axios.get(url);

    return response.data;
  } catch (error) {
    // 재시도 횟수가 남아 있으면 API 재요청
    if (retries > 0) {
      // 딜레이
      await new Promise((resolve) => setTimeout(resolve, delay));

      // 일정 시간 만큼 딜레이를 증가 후 API 재요청
      return fetchData(url, retries - 1, delay + increment, increment);
    } else {
      throw new Error("All retries failed");
    }
  }
};

Fixed Delay

  • API 요청 후 에러가 발생하면, 사용자가 설정한 일정한 지연 시간이 지난 후 재요청합니다.
const axios = require("axios");

let errorCount = 0;

const fetchData = async (url, retries, delay) => {
  try {
    errorCount++;

    // 강제 에러 발생 시키기
    if (errorCount <= 2) {
      throw new Error("Network request failed");
    }

    const response = await axios.get(url);

    return response.data;
  } catch (error) {
    // 재시도 횟수가 남아 있으면 API 재요청
    if (retries > 0) {
      // 딜레이
      await new Promise((resolve) => setTimeout(resolve, delay));

      // 고정적인 딜에이 만큼 지연 후 API 재요청
      return fetchData(url, retries - 1, delay);
    } else {
      throw new Error("All retries failed");
    }
  }
};

Randomised Retry

  • API 요청 후 에러가 발생하면, 사용자가 설정한 최소(min) 및 최대(max) 지연 시간 사이에서 랜덤으로 지연 시간이 지난 후 재요청합니다.
const axios = require("axios");

let errorCount = 0;

const fetchData = async (url, retries, minDelay, maxDelay) => {
  try {
    errorCount++;

    // 강제 에러 발생 시키기
    if (errorCount <= 2) {
      throw new Error("Network request failed");
    }

    const response = await axios.get(url);

    return response.data;
  } catch (error) {
    // 재시도 횟수가 남아 있으면 API 재요청
    if (retries > 0) {
      // 랜덤 지연 시간 계산 설정
      const randomDelay = Math.random() * (maxDelay - minDelay) + minDelay;

      // 딜레이
      await new Promise((resolve) =>
        setTimeout(resolve, Math.round(randomDelay))
      );

      // API 재요청
      return fetchData(url, retries - 1, minDelay, maxDelay);
    } else {
      throw new Error("All retries failed");
    }
  }
};

Immediate Retry

  • API 요청 후 에러가 발생하면 즉시 재요청합니다.
const axios = require("axios");

let errorCount = 0;

const fetchData = async (url, retries) => {
  try {
    errorCount++;

    // 강제 에러 발생 시키기
    if (errorCount <= 2) {
      throw new Error("Network request failed");
    }

    const response = await axios.get(url);

    return response.data;
  } catch (error) {
    // 재시도 횟수가 남아 있으면 API 재요청
    if (retries > 0) {
      // 즉시 API 재요청
      return fetchData(url, retries - 1);
    } else {
      throw new Error("All retries failed");
    }
  }
};

관련 라이브러리

참고

profile
아직 나는 취해있을 수 없다...

0개의 댓글

관련 채용 정보