runlot

재활성 창

오래 잠든 프로젝트가 돌아올 때 무슨 일이 일어나고, 그 사이 몇 초 동안 무엇이 다른지.

주차 보다 더 오래 요청이 없으면, 프로젝트는 노드에서 완전히 내려가고 데이터베이스가 봉인되어 오프사이트에 보관됩니다. 이 상태를 콜드라고 부릅니다.

돌아오는 길

콜드 상태에서 첫 요청이 오면 이렇게 진행됩니다.

  1. 앞단이 요청을 받고 503 cold 로 답하면서 재활성을 시작합니다.
  2. 봉인된 데이터베이스를 노드로 내려받아 풉니다.
  3. 새 세대가 열리고, 워커가 뜹니다.

여기까지 보통 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 초에 돌아옵니다.

이 페이지에서