쿼리 재시도하기 (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;
}