4편까지는 무엇을 만들었는지 이야기했습니다. 이번 편은 만든 걸 공개한 뒤에 터진 일입니다.
버튜버 대시보드를 공개하고 며칠 지나지 않은 10월 21일 새벽 0시 15분, 서버가 죽었어요. 사람이 갑자기 몰린 것도 아니었습니다. 몰려온 건 검색 로봇(크롤러) 이었어요.
무슨 일이 있었나
기록을 보니 같은 페이지가 비정상적으로 많이 열리고 있었습니다. 한 소속사 페이지 하나가 한 시간에 수천 번 열렸어요. 사람이 그렇게 볼 리는 없죠.
원인은 주소였습니다. 버튜버·소속사 페이지에는 탭, 페이지 번호, 멤버 필터 같은 상태가 주소 뒤에 붙어요.
/streamers/아라하시-타비?cz=replay&czp=2&ysp=2&ytp=2&xp=2
(위는 버튜버 페이지의 예예요.) 사람에게는 편한 기능이에요. 보던 화면을 그대로 공유할 수 있으니까요. 그런데 크롤러에게는 조합마다 다른 페이지로 보입니다. 탭 몇 개 × 페이지 몇 개 × 멤버 몇 명… 조합이 끝없이 나오고, 크롤러는 그걸 하나하나 다 열어 봤어요.
문제는 그 페이지들이 열릴 때마다 서버가 꽤 큰 계산을 한다는 점이었습니다. 수천 명의 버튜버와 계정, 소속을 불러와 묶는 계산이요. 크롤러 여러 대가 동시에 몰리니 같은 계산이 여러 개 겹쳐 돌았고, 결국 서버가 감당할 수 있는 메모리를 넘어 죽었습니다.
1. 같은 답은 한 번만 계산한다
가장 먼저 고친 건 같은 질문에 매번 새로 계산하는 것이었어요.
사실 웹 쪽에도 잠깐 들고 있다 다시 쓰는 장치(캐시)가 있었습니다. 그런데 운영 환경에서는 생각만큼 막아 주지 못했어요. 캐시가 끝나는 순간 여러 곳에서 동시에 다시 물어 왔고, 너무 큰 응답은 아예 담지도 못했습니다.
그래서 서버 쪽에서 직접 막았습니다.
- 방금 계산한 답은 잠깐 들고 있다가 다시 쓴다 — 홈, 목록, 소속사·기수 페이지, 팔로워 지도처럼 무거운 화면부터. 데이터가 바뀌는 주기(10분~하루)보다 짧게만 들고 있어서, 낡은 화면이 오래 남지 않아요.
- 같은 질문이 동시에 오면 계산은 한 번 — 뒤에 온 요청은 앞의 계산이 끝나길 기다렸다가 같은 답을 받습니다. 몰려와도 계산은 겹치지 않아요.
- 관리 화면에서 무언가 고치면 전부 비운다 — 소속을 바꿨는데 화면이 그대로면 안 되니까요.
- 들고 있는 개수에도 상한 — 검색어처럼 갈래가 많은 요청이 메모리를 다 먹지 않게, 오래된 것부터 버립니다.
2. 로봇에게 길을 알려 준다
계산을 줄여도, 크롤러가 끝없는 조합을 계속 도는 건 그 자체로 낭비입니다. 검색에 필요한 건 각 페이지의 기본 주소 하나뿐이고요.
그래서 robots.txt 에 주소 뒤에 조건이 붙은 페이지는 크롤링하지 말라고 적었어요.
User-Agent: *
Allow: /
Allow: /map?view=live$
Disallow: /*?
딱 하나 예외는 지금 방송 지도입니다. 이 페이지는 ?view=live 가 붙은 주소가 곧 기본 주소라 검색에 나와야 하니까요. 탭이나 필터가 붙은 나머지 주소는 각 페이지가 기본 주소를 대표 주소(canonical)로 알려 주고 있어서, 크롤링을 막아도 검색에서 손해 보는 건 없습니다.
3. 안 쓰는 데이터를 덜어낸다
마지막으로 응답 자체를 가볍게 했습니다.
3편에서 치지직 클립과 다시보기는 저장하지 않고 볼 때 치지직에서 바로 받기로 했다고 썼죠. 그런데 소속사·기수 응답에는 예전에 모아 둔 클립 데이터가 여전히 실려 나가고 있었어요. 화면은 치지직에서 새로 받은 걸로 덮어쓰니, 실어 보내고는 그대로 버리던 셈입니다.
이걸 빼니 한 소속사 응답이 3분의 1 크기로 줄었습니다. 방식을 바꿀 때 예전 데이터를 응답에서까지 확실히 걷어냈어야 했는데, 화면에서 안 보이니 놓쳤던 거예요.
배운 것
- 공개하면 사람보다 로봇이 먼저 온다 — 검색에 잘 나오게 하려고 사이트맵을 내밀었으니, 크롤러가 오는 건 당연한 일이었어요. 문제는 그들이 사람보다 훨씬 부지런하고, 주소 조합을 사람처럼 골라 보지 않는다는 점이었습니다.
- 주소에 상태를 담으면 크롤러 함정이 된다 — 공유하기 좋은 주소와 크롤링하기 좋은 주소는 다릅니다. 처음부터
robots.txt와 대표 주소를 같이 설계해야 했어요. - 무거운 계산은 겹치지 않게 — 한 번의 계산은 버텨도, 같은 계산이 여러 개 겹치면 못 버팁니다. "같은 답은 한 번만"이 가장 효과가 컸어요.
- 바꾼 뒤엔 남은 것도 치운다 — 방식을 바꿀 때 화면만 바꾸고 응답을 그대로 두면, 아무도 안 쓰는 데이터가 계속 실려 다닙니다.
다음 편에서는 반대로, 크롤러와 사람이 잘 찾아오게 만든 이야기 — 검색과 공유를 다룹니다.