본문으로 건너뛰기
runlot

콜드 상태와 재시작

콜드 상태의 프로젝트를 다시 활성화하는 과정과 일시적으로 달라지는 동작을 안내합니다.

프로젝트가 자동 중지된 상태에서 노드의 디스크 공간이 부족해지면, 프로젝트 프로세스를 종료하고 데이터베이스를 암호화해 오프사이트에 보관합니다. 이 상태를 콜드 상태라고 합니다.

재활성화 과정

콜드 상태의 프로젝트에 첫 요청이 오면 다음 순서로 재활성화합니다.

  1. 프런트가 요청에 503 cold를 응답하고 재활성화를 시작합니다.
  2. 암호화해 보관한 데이터베이스를 노드로 내려받아 복원합니다.
  3. 새 세대를 열고 워커 프로세스를 시작합니다.

이 과정은 보통 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)));
    }
  }
}

위의 재시도면 충분합니다. 이 구간은 짧고, 스스로 닫힙니다.

언제 콜드가 되나요

콜드 상태로 전환하는 기준은 유휴 시간이 아니라 노드의 디스크 공간 부족입니다. 노드에 여유 공간이 있으면 며칠 동안 사용하지 않아도 데이터는 노드에 그대로 남습니다. 이 경우 외부 저장소에서 데이터를 내려받지 않고 워커만 다시 시작합니다.

이 페이지의 목차