콜드 상태와 재시작
콜드 상태의 프로젝트를 다시 활성화하는 과정과 일시적으로 달라지는 동작을 안내합니다.
프로젝트가 자동 중지된 상태에서 노드의 디스크 공간이 부족해지면, 프로젝트 프로세스를 종료하고 데이터베이스를 암호화해 오프사이트에 보관합니다. 이 상태를 콜드 상태라고 합니다.
재활성화 과정
콜드 상태의 프로젝트에 첫 요청이 오면 다음 순서로 재활성화합니다.
- 프런트가 요청에
503 cold를 응답하고 재활성화를 시작합니다. - 암호화해 보관한 데이터베이스를 노드로 내려받아 복원합니다.
- 새 세대를 열고 워커 프로세스를 시작합니다.
이 과정은 보통 6~7초가 걸립니다. 진행 중인 요청에는 503 응답과 함께 몇 초 후 다시 시도하라는 안내를 제공합니다.
재활성 직후의 일시적 제한
재활성 직후 상태 동기화 주기 동안(최대 3초), 데이터베이스를 사용하는 요청은
57P03 runlot_fenced 오류로 실패할 수 있습니다. 같은 시간에도 데이터베이스를 사용하지 않는 경로(예: /)는 200 응답을 반환합니다.프런트가 새 데이터베이스 세대로 요청을 전달하기 시작한 뒤에도 노드 프로세스의 상태 동기화에는 짧은 시간이 걸릴 수 있습니다. 이때 애플리케이션은 응답하지만 데이터베이스 요청만 일시적으로 실패할 수 있습니다.
대응 방법. 애플리케이션에서 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)));
}
}
}이 동작은 알려진 제한 사항이며, 향후 개선할 예정입니다.
언제 콜드가 되나요
콜드 상태로 전환하는 기준은 유휴 시간이 아니라 노드의 디스크 공간 부족입니다. 노드에 여유 공간이 있으면 며칠 동안 사용하지 않아도 데이터는 노드에 그대로 남습니다. 이 경우 외부 저장소에서 데이터를 내려받지 않고 워커만 다시 시작합니다.