재활성 창
오래 잠든 프로젝트가 돌아올 때 무슨 일이 일어나고, 그 사이 몇 초 동안 무엇이 다른지.
주차 보다 더 오래 요청이 없으면, 프로젝트는 노드에서 완전히 내려가고 데이터베이스가 봉인되어 오프사이트에 보관됩니다. 이 상태를 콜드라고 부릅니다.
돌아오는 길
콜드 상태에서 첫 요청이 오면 이렇게 진행됩니다.
- 앞단이 요청을 받고
503 cold로 답하면서 재활성을 시작합니다. - 봉인된 데이터베이스를 노드로 내려받아 풉니다.
- 새 세대가 열리고, 워커가 뜹니다.
여기까지 보통 6~7 초입니다. 그동안의 요청은 503 을 받고, 몇 초 뒤 다시 시도하라는 안내가 붙습니다.
알아 두셔야 할 창
재활성 직후 한 수렴 주기(최대 3 초) 동안, 데이터베이스를 지나는 요청이
57P03 runlot_fenced 로 실패할 수 있습니다. 같은 시각에 데이터베이스를 건드리지 않는 경로(/ 같은)는 200 을 돌려줍니다.앞단은 새 세대로 프록시를 시작하는데, 노드의 프로세스가 다음 수렴까지 아직 옛 세대의 것이라 생기는 창입니다. 클라이언트 입장에서는 "돌아왔는데 DB 만 잠깐 안 된다" 로 보입니다.
대응. 앱 안에서 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)));
}
}
}이 창은 알려진 문제이고, 없애는 것이 다음 회차의 일입니다.
언제 콜드가 되나요
유휴 시간이 아니라 노드의 디스크 압박이 방아쇠입니다. 노드에 자리가 넉넉하면 며칠 안 써도 주차 상태로 남아 있고, 그때는 0.4 초에 돌아옵니다.