본문 바로가기
C.W.K.
Stream
Lesson 02 of 05 · published

Live Tick 은 만료된다

~10 min · ttl, overlay, durability, freshness

Level 0Open Gate
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"live 가격은 세입자가 아니라 손님이야. 15분 머물고 나면 durable close 가 제 의자를 되찾아 가."

live 는 overlay 지 교체가 아니야

스트리밍이 켜져 있으면 live tick 이 가장 따끈한 가격을 물어다 줘. 근데 Keep 는 그 live 값이 진실 자체가 되게 두질 않아. durable close 위에 잠깐 덧칠한 overlay 일 뿐이고, 만료 시간이 있어. LIVE_TTL_SECONDS, 그러니까 15분이 지나면 live tick 은 만료되고 '현재 값' 의 소유권은 저장된 completed close 로 돌아가. durable close 가 이 집의 주인이고, live tick 은 타이머를 든 손님인 거지.

만료가 왜 그렇게 중요한데

만료가 없다고 상상해 봐. Keep 를 열고 스트리밍이 한참 돌다가, 노트북이 잠들거나 네트워크가 끊기거나 네가 자리를 떠. 마지막 live tick 은 이제 화면에 얼어붙어 있어. 한 시간 전, 어쩌면 어제의 가격이, 방금 온 값과 똑같이 당당한 얼굴로 앉아 있는 거야. 이 얼어붙은 tick 이 낡은 데이터 중에서도 최악이야. live 처럼 보이는데 live 가 아니거든. TTL 이 이 실패 모드를 끝장내. 새 tick 없이 15분이 지나면 Keep 는 옛 tick 을 그만 믿고 durable close 로 내려가. 적어도 그 값은 제 날짜를 정직하게 달고 있으니까. 정체를 아는 종가가 거짓말하는 tick 보다 나아.

수명이 짧은 데이터엔 만료를 달아 줘. 안 그러면 저절로 거짓말이 돼. 한순간에만 유효한 값은 TTL 이 없으면 그 순간이 한참 지난 뒤에도 유효한 척 계속 표시돼. 변덕스러운 데이터에 시간 제한을 거는 건 최적화가 아니야. '지금 live' 와 '한 시간 전에 얼어붙었는데 live 인 척' 을 가르는 장치야.

레이어를 명시적으로 쌓았어

어느 종목이든 Keep 의 현재 값은 작은 스택이야. 바닥엔 durable completed close 가 깔려 있어. 항상 존재하고 항상 날짜가 붙어 있지. 그 위에 live tick 이 신선한 동안에만 덧칠돼. 읽기는 위에서 아래로 내려가되 TTL 을 존중해. 유효 시간 안의 live tick 은 이기고, 만료된 tick 은 애초에 없었던 것처럼 무시돼. 이 구조 덕분에 다음 레슨의 'pause' 가 안전해지는 거야. pause 는 새 tick 을 끊을 뿐이고, 이미 있던 overlay 는 알아서 나이 들어 물러나면서 정직한 durable close 한테 자리를 넘겨줘.

쉬는 상태의 주인은 언제나 durable close 야. live 가격을 둘러싼 모든 설계는, 소동이 멈추는 순간을 위해 있어. pause 를 누르든, 노트북을 닫든, TTL 이 지나든, 화면은 얼어붙은 live 숫자가 아니라 날짜 달린 차분한 저장 종가로 내려앉아. live 는 네가 선택해서 켜는 예외고, completed close 가 홈베이스야.

Code

live tick 은 TTL 안에서만 이긴다 (예시)·typescript
const LIVE_TTL_SECONDS = 15 * 60;

function currentValue(durableClose: Close, liveTick: Tick | null): Value {
  if (liveTick && ageSeconds(liveTick) < LIVE_TTL_SECONDS) {
    return { value: liveTick.value, basis: "live" };   // 신선한 overlay 가 이겨
  }
  // tick 이 없거나 만료됐어. 날짜 달린 durable close 로 내려가.
  // 만료된 tick 은 애초에 없었던 것처럼 다뤄.
  return { value: durableClose.value, basis: "close", asOf: durableClose.date };
}

// 낡은 tick 은 현재 가격 행세를 못 해.
// TTL 이 지나면 정직한 close 가 조용히 소유권을 되찾아.

External links

Exercise

UI 에서 'live' 나 'real-time' 값을 보여주는 곳을 찾아 봐. 그리고 물어봐. 업데이트가 그냥 멈추면 무슨 일이 벌어져? sleep 이든 disconnect 든 백그라운드 탭이든. 마지막 값이 얼어붙은 채 당당한 얼굴로 남아 있진 않아? TTL 을 설계해 봐. 얼마가 지나면 그 값을 그만 믿어야 하고, 그다음엔 뭐로 내려앉아야 할까? '지금 42' 와 '한 시간 전에 42 였는데 얼어붙음' 의 차이를 묘사해 봐.
Hint
위험한 건 live 처럼 보이는데 더는 갱신되지 않는 값이야. 얼어붙은 tick 은 라벨 달린 낡은 값보다 나빠. 멈췄다는 신호가 아무 데도 없거든. TTL 에 정직한 내려앉기('마지막 종가 기준으로 되돌림' 표시)를 더하면, 소리 없는 얼어붙음이 눈에 보이는 올바른 강등으로 바뀌어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.