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

유도물은 영원히 캐싱하고, 거창한 절차 없이 퇴비로 만들어

~11 min · caching, cost, data-modeling, derived-data

Level 0미분류
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

캐시 키가 설계 전부야

요약이든 번역이든 정리된 본문이든, 유도된 텍스트는 한 번 비싸고 그다음엔 공짜야. 두 번째 요청을 알아볼 수 있을 때만. 그러니까 키는 출력을 바꿀 만한 걸 전부 지명해야 해. 어느 기사인지, 어떤 종류의 유도인지, 어떤 목표 언어인지. 차원 하나를 빠뜨리면 엉뚱한 산물을 돌려주거나 이미 있는 걸 또 사게 돼.

기사만으로 키를 잡는 게 고전적 실수고, 더 창피한 방향으로 실패해. 요약을 요청하고 그다음 번역을 요청하면, 두 번째 요청이 캐시 항목을 찾아서 요약을 돌려줘. 복합 키는 아무 비용도 안 들고 틀린 답을 표현 불가능하게 만들어.

날것 말고 처리된 형태에서 유도해

유도엔 입력이 정확히 하나여야 하고, 그건 날 추출본이 아니라 정리된 본문이어야 해. 날 출력을 요약하는 건 기사랑 같이 내비게이션 메뉴랑 쿠키 안내를 요약하는 거고, 같은 값에 더 나쁜 결과를 내지.

결과로 명시할 값어치가 있는 의존이 생겨. 아직 처리 안 된 기사한텐 유도가 날 형태로 물러나지 않고 정중히 사양해. 엉뚱한 입력으로 만들어진 캐시된 유도물은 유도물이 없는 것보다 나빠. 아래쪽 어디서도 어느 입력이 그걸 냈는지 알 수 없으니까.

전부 모형이 필요한 건 아냐

빌려 갈 값어치가 있는 세부 하나. 기사가 무슨 언어인지 정하는 데 턴이 필요 없어. 문자 종류를 세면 결정론적으로, 즉시, 공짜로 답이 나와. 규칙이 일반화돼. 분류에 턴을 쓰기 전에 답이 계산 가능한지 물어봐. 언어 감지, 길이, 이게 목록인지, 필드가 비었는지. 전부 모형 작업으로 제안되고 전부 그러면 안 되는 것들이야.

퇴비로 만들어도 되고, 그게 요점이야

유도물의 목소리 사양이 바뀌었을 때, 앞서 캐싱된 텍스트는 옛 사양 아래 생성된 거였어. 마이그레이션 대신 지웠고, 다음 탭이 다시 유도했지.

그게 변호 가능한 건 유도물이 뭔지 때문이야. 아직 존재하는 입력에서 재생산 가능한 작업 집합. 아무것도 안 잃었어. 거기 원본이 없었으니까. "지워, 다시 나올 거야"라고 말할 수 있는 게 유도 데이터를 엄격히 유도된 채로 둬서 얻는 성질이야. 그리고 유도물이 수정이나 주석이나 손으로 한 정정을 얻는 순간 그 성질이 사라지고 영원히 마이그레이션 문제를 안게 돼.

유도 데이터는 버릴 수 있어서 캐시를 벌어. 지우고 다시 생기게 못 하면 그건 더 이상 유도물이 아니라 비싼 생성자를 가진 저장소고, 만드는 방식에 대한 앞으로의 모든 변경이 데이터 마이그레이션이 돼.

Code

복합 캐시 키, 그리고 기사 표와 달리 여기선 왜 캐스케이드인지·sql
-- The key names every dimension that changes the output. Keying on
-- article_id alone returns a summary when a translation was asked for,
-- which is the wrong answer rather than merely a slow one.
CREATE TABLE article_texts (
  article_id INTEGER NOT NULL REFERENCES articles(id) ON DELETE CASCADE,
  kind       TEXT    NOT NULL,   -- 'summary' | 'translation'
  lang       TEXT    NOT NULL,   -- target language of THIS artifact
  content    TEXT    NOT NULL,
  created_at TEXT    NOT NULL,
  PRIMARY KEY (article_id, kind, lang)
);

-- CASCADE is correct HERE, and SET NULL was correct on articles.source_id.
-- The difference is what the row means: a derivation of a deleted
-- article is meaningless, while an article whose source was deleted is
-- still an article. Cascade follows meaning, not habit.

External links

Exercise

네 시스템에서 비싼 결과 캐시를 찾아, 출력에 영향을 주는 입력을 전부 적어봐. 그 목록을 캐시 키랑 비교해. 빠진 게 있으면 부딪히는 요청 둘을 만들어서 두 번째가 뭘 돌려주는지 확인해. 마지막으로 버릴 수 있는지 물어봐. 오늘 그 표를 통째로 지우고 다시 채워지게 둘 수 있어?
Hint
키에서 빠지는 차원은 보통 나중에 추가된 거야. 새 변종, 새 언어, 새 모형. 키는 하나뿐일 때 쓰였으니 그걸 지명할 필요가 없었고, 두 번째 변종은 아무도 기본 키를 다시 안 보고 도착하지.

Progress

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

댓글 0

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

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