콜드 상태와 재시작
콜드 상태의 프로젝트를 다시 활성화하는 과정과 일시적으로 달라지는 동작을 안내합니다.
프로젝트가 자동 중지된 상태에서 노드의 디스크 공간이 부족해지면, 프로젝트 프로세스를 종료하고 데이터베이스를 암호화해 오프사이트에 보관합니다. 이 상태를 콜드 상태라고 합니다.
재활성화 과정
콜드 상태의 프로젝트에 첫 요청이 오면 다음 순서로 재활성화합니다.
- 프런트가 요청에
503 cold를 응답하고 재활성화를 시작합니다. - 암호화해 보관한 데이터베이스를 노드로 내려받아 복원합니다.
- 새 세대를 열고 워커 프로세스를 시작합니다.
이 과정은 보통 6~7초가 걸립니다. 진행 중인 요청에는 503 응답과 함께 몇 초 후 다시 시도하라는 안내를 제공합니다.
재활성 직후의 일시적 제한
재활성 직후의 짧은 구간(최대 3초) 동안, 데이터베이스를 사용하는 요청은 PostgreSQL 오류 코드
57P03으로 실패할 수 있습니다. 같은 구간에도 데이터베이스를 건드리지 않는 경로(예: /)는 평소대로 200을 반환합니다.복원된 데이터베이스가 질의를 받을 준비를 마치기 전에 워커가 먼저 응답을 시작합니다. 그 겹치는 구간에서는 애플리케이션이 평소대로 응답하고 데이터베이스 호출만 57P03으로 실패합니다 — "지금은 데이터베이스가 연결을 받지 않는다"를 뜻하는 표준 코드입니다.
대응 방법. 애플리케이션에서 57P03 오류를 짧은 간격으로 재시도하면 이 기간을 처리할 수 있습니다.
async function withRetry<T>(fn: () => Promise<T>, tries = 4): Promise<T> {
for (let i = 0; ; i++) {
try {
return await fn();
} catch (e) {
const code = (e as { code?: string }).code;
if (code !== "57P03" || i >= tries) throw e;
await new Promise((r) => setTimeout(r, 500 * (i + 1)));
}
}
}위의 재시도면 충분합니다. 이 구간은 짧고, 스스로 닫힙니다.
언제 콜드가 되나요
콜드 상태로 전환하는 기준은 유휴 시간이 아니라 노드의 디스크 공간 부족입니다. 노드에 여유 공간이 있으면 며칠 동안 사용하지 않아도 데이터는 노드에 그대로 남습니다. 이 경우 외부 저장소에서 데이터를 내려받지 않고 워커만 다시 시작합니다.