start_link는 이름부터 든든하지만, 이게 반환됐을 때 클라이언트가 실제로 알게 된 건 뭘까요?
이 캐시 서비스에서 init은 {:ok, state, {:continue, :warm_cache}}를 반환해요. 시작 호출은 init이 반환될 때까지만 기다려요. 데우는 작업은 그다음 handle_continue에서 해요. 그러니 시작 응답이 말해 주는 건 프로세스가 떴다는 사실이지, 캐시가 데워졌다는 게 아니에요. 이 GenServer 안에서 클라이언트 요청은 continuation과 동시에 실행되지 않고 그 뒤에 줄을 서요.
여기에 ready라는 말을 붙여 볼까요? 클라이언트가 정상 시작 표시를 보고 바로 캐시 값을 요청해요. 그 표시가 init 반환만 뜻한다면 ready는 너무 많은 걸 약속하는 거예요.
솔직한 선택지는 두 가지예요. 데우기가 끝날 때까지 준비 상태를 미루거나, Warming을 드러내고 기다릴 수 있는 요청 수를 묶어 두거나요. 기다리게 하는 쪽을 고르면 시간 초과 때 대기 작업에서 무엇을 빼야 하는지도 정해야 해요.
감독 아래 재시작도 같은 자리로 돌아와요. 프로세스를 다시 띄우는 것과 쓸 만한 캐시를 되살리는 건 다른 약속이에요. ready는 클라이언트가 바라는 쪽에 붙이고, 나머지는 started라고 부르면 충분해요.