자동화 파이프라인7 분 읽기

갓 발행한 글이 제비뽑기에 당첨돼야만 노출되고 있었다

개발 블로그 글을 소셜 타래로 자동 소개하는 엔진은 날짜 시드 modulo 로테이션으로 최신 6편 중 한 편을 골랐습니다. 이 로테이션은 글이 얼마나 새것인지 보지 않았고, 그래서 '발행하면 자동으로 노출된다'는 말은 사실상 제비뽑기였습니다. 최신 발행 배치를 3일 동안 우선 노출하도록 고친 과정과, 아직 모르는 점을 정리했습니다.

#content-rotation#social-automation#python#recency#scheduling
왼쪽: 최신 6편이 같은 크기로 늘어선 추첨 풀. 오른쪽: 최근 3일 배치만 남은 좁은 풀.
균등 로테이션은 재고를 고르게 돌리는 데에는 맞지만, 새 글을 바로 내보내는 일에는 맞지 않았습니다.

발행했는데 안 나오는 날

제 소셜 타래 자동 발행 엔진에는 개발 블로그 글을 한 편 골라 소개하는 기능이 있습니다. 글을 고르는 함수는 pick_devlog_post이고, 후보는 최신 6편입니다. 고르는 방식은 단순했습니다. 날짜를 시드로 삼아 후보 수로 나눈 나머지(modulo)로 한 편을 고릅니다. 날마다 다른 글이 나오고 같은 날에는 늘 같은 글이 나옵니다. 재현할 수 있고 테스트하기도 쉬운 방식이라 오래 의심하지 않았습니다.

그런데 이 로테이션은 후보 6편을 똑같이 취급했습니다. 오늘 아침에 낸 글과 며칠 전에 낸 글이 같은 무게를 가졌습니다. 갓 발행한 글이 그날 타래에 오를지는 날짜 나머지가 마침 그 글을 가리키느냐에 달려 있었습니다. 풀 크기를 n이라고 하면 확률은 1/n이었습니다.

여러분의 자동 노출 파이프라인에서 '방금 낸 것'이 '예전에 낸 것'보다 먼저 나온다는 보장은 코드 어디에 들어 있나요?

제 경우에는 그런 보장이 어디에도 없었습니다. '발행하면 자동으로 노출된다'는 제 머릿속에만 있던 가정이었습니다.

로직이 틀린 게 아니라 질문이 빠져 있었다

로테이션 자체에는 버그가 없었습니다. 의도한 대로 골고루 돌았고, 테스트도 통과했습니다. 빠진 것은 '이 글이 얼마나 새것인가'라는 질문이었습니다. 균등 로테이션은 오래된 재고를 고르게 다시 꺼내는 데에는 맞는 도구입니다. 하지만 새 글을 바로 내보내는 일에는 맞지 않습니다. 두 목적이 함수 하나에 섞여 있었는데, 코드는 앞의 목적만 처리하고 있었습니다.

이런 문제는 대시보드에 잘 드러나지 않습니다. 매일 무언가는 발행되니 파이프라인은 늘 초록색입니다. 무엇이 발행됐는지를 직접 들여다봐야 비로소 이상하다는 걸 알게 됩니다.

당신이라면?

새 글에 가중치를 주시겠어요, 아니면 일정 기간 새 글만 돌리시겠어요?

신선한 창 안에서는 최신 배치만 돌린다

저는 두 번째를 골랐습니다. 규칙은 이렇습니다.

  • 같은 날 발행된 최신 글 묶음을 '최신 발행 배치'로 봅니다.
  • 그 배치가 FRESH_DAYS(3일) 안에 있으면 로테이션 후보를 그 배치로만 좁힙니다.
  • 3일이 지나면 원래대로 최신 6편 안에서 도는 로테이션으로 돌아갑니다.

가중치 방식은 따로 정해야 할 값이 늘어납니다. 반면 창을 두는 방식은 FRESH_DAYS라는 숫자 하나만 정하면 됩니다. 같은 날 여러 편을 낸 경우에도 그 배치 안에서는 기존과 같은 날짜 시드 로테이션이 그대로 동작합니다.

신경 쓴 부분이 하나 더 있습니다. 기존 latest_devlog_posts 함수는 다른 곳에서도 쓰고 테스트도 걸려 있었습니다. 그래서 날짜 정보까지 함께 돌려주는 _latest_devlog_dated 래퍼를 새로 만들고, 기존 함수의 시그니처는 그대로 두었습니다. 덕분에 test_content는 손대지 않은 채로 통과했습니다. 변경은 engine/content.py 한 파일, 24줄 추가와 7줄 삭제였습니다.

자가진단 체크리스트

  • 자동 노출 로테이션이 후보의 발행 시점을 입력으로 받고 있나요, 아니면 목록 순서만 보고 있나요?
  • 오늘 발행한 항목이 오늘 노출될 확률을 숫자로 말할 수 있나요?
  • '오래된 재고 재노출'과 '신규 즉시 노출'이 함수 하나에 섞여 있지는 않나요?

솔직한 부분

FRESH_DAYS를 3으로 정한 데에 근거 데이터는 없습니다. 2일이나 5일과 비교해 보지도 않았습니다. 이 수정 뒤에 소개 타래의 반응이 달라졌는지도 아직 측정하지 않았습니다. 창이 열려 있는 동안에는 바로 이전 배치의 글이 노출에서 밀려나는데, 이것이 얼마나 손해인지도 모릅니다. 확실한 건 하나뿐입니다. 이제 갓 발행한 글은 창이 열려 있는 동안 날짜 나머지를 운에 맡기지 않고 후보 자리에 들어갑니다.

관련 글