본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

쿼리 재시도하기 (Retry queries)

원문 보기 위키 갱신

일시적인 오류가 발생할 때 애플리케이션에서 쓰기 쿼리를 재시도하는 것이 유용해요. D1_ERROR 목록에서 Recommended action 열을 참고해서 쿼리를 재시도해야 하는지 결정하세요.

참고

D1은 재시도 가능한 오류가 발생하면 읽기 전용 쿼리를 최대 두 번 더 자동으로 재시도해요.

출처: 문서

본문

쿼리 재시도 예시

D1 읽기 복제 스타터 템플릿 ↗︎에서 가져온 shouldRetry(...) 함수의 다음 예시를 생각해 보세요.

재시도가 더 성공적이도록 지터(jitter)가 있는 지수 백오프(exponential backoff) 전략을 적용해야 해요. 이를 추상화한 @cloudflare/actors ↗︎ 같은 라이브러리를 사용하거나, 재시도 로직을 복사해서 ↗︎ 여러분의 코드에 직접 넣을 수 있어요.

import { tryWhile } from "@cloudflare/actors";

function queryD1Example(d1: D1Database, sql: string) {
  return await tryWhile(async () => {
    return await d1.prepare(sql).run();
  }, shouldRetry);
}

function shouldRetry(err: unknown, nextAttempt: number) {
  const errMsg = String(err);
  const isRetryableError =
    errMsg.includes("Network connection lost") ||
    errMsg.includes("storage caused object to be reset") ||
    errMsg.includes("reset because its code was updated");
  if (nextAttempt <= 5 && isRetryableError) {
    return true;
  }
  return false;
}

더 알아보기 (Learn more)