![[실전 서버리스 17] Cron Triggers, 서버 없이 정기 작업 돌리기](https://img.thenullpage.com/posts/5619/5619_1_80fbe0.webp)
사이트를 운영하다 보면 주기적으로 돌려야 하는 작업이 있다. 통계를 집계하고, 오래된 데이터를 정리하고, 캐시를 갱신하는 것들이다. 전통적으로는 이런 걸 서버에 정기 작업으로 걸어뒀는데, 서버가 없는 서버리스에서는 어떻게 할까. 답은 크론 트리거다. 이번 편은 서버 없이 정기 작업을 돌리는 법을 다룬다.
앞서 여러 편에서 정기 작업으로 상한을 갱신하거나 캐시를 채운다고 했는데, 그게 다 이 크론으로 돈다. 서버리스 운영의 숨은 일꾼이다.
1. 크론 트리거란
크론 트리거는 정해진 시간표에 따라 워커를 자동으로 실행하는 기능이다. 매시간, 매일, 특정 시각처럼 원하는 주기를 정하면, 그때마다 워커가 알아서 실행된다. 사용자 요청이 없어도 스스로 도는 것이다. 서버에 정기 작업을 걸던 것을, 서버 없이 하는 방법이다.
이게 서버리스답게 편한 이유는, 정기 작업을 위한 서버를 따로 둘 필요가 없다는 것이다. 전통적으로는 정기 작업을 돌리려면 서버가 계속 켜져 있어야 했다. 그런데 크론 트리거는 정해진 시각에만 워커를 깨워 실행하고 끝낸다. 안 도는 시간엔 아무 자원도 안 쓴다. 정기 작업도 서버리스의 쓴 만큼만 원칙을 따른다.
설정도 간단하다. 앞서 다룬 설정 파일에 언제 실행할지 시간표를 적으면 된다. 그러면 그 주기에 맞춰 워커의 정해진 진입점이 호출된다. 사용자 요청을 처리하는 진입점과는 별개로, 정기 실행용 진입점이 있어서 거기에 정기 작업 코드를 둔다.
크론 트리거가 서버리스답게 편한 건 정기 작업용 서버가 필요 없다는 점이다. 전통적으로는 정기 작업을 돌리려고 서버를 계속 켜뒀는데, 크론 트리거는 정해진 시각에만 워커를 깨워 실행하고 끝낸다. 안 도는 시간엔 자원을 안 쓴다. 정기 작업도 서버리스의 쓴 만큼만 원칙을 따르는 것이다.
한 가지 더, 크론 트리거는 여러 주기를 함께 설정할 수 있다. 매시간 도는 것, 매일 도는 것, 특정 요일에 도는 것을 각각 정해둘 수 있다. 그래서 자주 해야 할 가벼운 작업은 매시간, 무거운 정리는 매일 한산한 시간에 하는 식으로 나눈다. 작업의 성격과 주기를 맞추는 게 정기 작업 설계의 기본이다.
2. 무엇을 정기적으로 돌리나
정기 작업의 대표적인 예가 집계와 갱신이다. 앞서 다룬 페이지 상한 계산이 그렇다. 매시간 전체 글 수를 세어 상한을 갱신해두면, 페이지 요청은 그 값을 비교만 하면 된다. 무거운 집계를 미리 정기적으로 해두고, 실시간 요청은 그 결과를 쓰는 것이다.
캐시 채우기도 정기 작업으로 한다. 자주 쓰이는 데이터를 미리 계산해 캐시에 넣어두면, 실제 요청이 왔을 때 계산 없이 바로 응답한다. 인기 글 목록이나 통계 위젯 같은 걸 정기적으로 미리 만들어두는 것이다. 사용자가 오기 전에 준비해두니 응답이 빠르다.
정리 작업도 정기적으로 돈다. 오래된 임시 데이터를 지우거나, 앞서 다룬 고아 파일을 점검하거나, 만료된 캐시를 청소하는 것들이다. 이런 청소는 계속 쌓이는 쓰레기를 주기적으로 치워 시스템을 깨끗하게 유지한다. 사람이 매번 하기 어려운 걸 크론이 대신 해준다.
정기 작업의 대표는 집계와 갱신이다. 앞서 다룬 페이지 상한 계산이 그렇다. 무거운 집계를 미리 정기적으로 해두고, 실시간 요청은 그 결과만 쓰는 것이다. 캐시 채우기도 마찬가지로, 자주 쓰이는 데이터를 미리 만들어두면 요청이 왔을 때 계산 없이 바로 응답한다. 사용자가 오기 전에 준비해두는 것이다.
3. 증분 처리의 원칙
정기 작업을 짤 때 중요한 원칙이 증분 처리다. 매번 전체를 다시 처리하지 말고, 지난번 이후 바뀐 것만 처리하는 것이다. 예를 들어 통계를 집계할 때 매번 전체 기간을 다시 계산하면 무겁다. 대신 지난번 집계 이후의 새 데이터만 더하면 가볍다.
증분 처리는 앞서 다룬 rows read 절감과도 통한다. 전체를 다시 읽지 않고 새 것만 읽으니 읽기량이 준다. 정기 작업이 매번 전체를 훑으면 그것도 비용이고 부담인데, 증분으로 하면 그 부담이 크게 준다. 정기 작업일수록 이 증분 원칙이 중요하다. 자주 도는 작업이 무거우면 그 부담이 누적된다.
증분 처리에서 주의할 건 구멍을 만들지 않는 것이다. 어디까지 처리했는지 정확히 기억하고, 다음번에 그 지점부터 빠짐없이 이어야 한다. 만약 처리 범위가 어긋나면 일부 데이터가 누락되거나 중복 처리된다. 그래서 증분 처리는 처리 지점을 정확히 관리하는 게 핵심이다. 이건 앞서 배치 처리에서 다룬 이어가기와 같은 원리다.
증분 처리 원칙이 정기 작업의 핵심이다. 매번 전체를 다시 처리하지 말고 지난번 이후 바뀐 것만 처리하는 것이다. 이건 앞서 다룬 rows read 절감과도 통한다. 전체를 다시 읽지 않고 새 것만 읽으니 부담이 준다. 자주 도는 정기 작업일수록 이 증분 원칙이 중요하다. 무거우면 그 부담이 누적되기 때문이다.
또 하나, 증분 처리에서 구멍을 만들지 않는 게 중요하다. 어디까지 처리했는지 정확히 기억하고 다음번에 그 지점부터 빠짐없이 이어야 한다. 처리 범위가 어긋나면 일부 데이터가 누락되거나 중복 처리된다. 그래서 증분 처리는 처리 지점을 정확히 관리하는 게 핵심이다. 배치 처리의 이어가기와 같은 원리다.
4. 크론 작업의 시간 관리
정기 작업을 언제 돌릴지도 신경 써야 한다. 무거운 작업은 트래픽이 적은 시간에 돌리는 게 좋다. 사용자가 많은 시간에 무거운 정기 작업이 돌면, 앞서 다룬 단일 스레드 특성 때문에 사용자 요청과 경쟁해 사이트가 느려질 수 있다. 그래서 무거운 정리나 집계는 한산한 시간에 배치한다.
또 여러 정기 작업이 한꺼번에 몰리지 않게 분산한다. 모든 작업을 같은 시각에 돌리면 그 순간 부하가 몰린다. 매시간 도는 것과 매일 도는 것을 겹치지 않게, 시간표를 잘 짜서 부하를 고르게 편다. 정기 작업의 시간표 설계가 사이트 안정성에 영향을 준다.
크론 작업에는 실행 시간 한도가 넉넉한 편이라, 사용자 요청보다 무거운 작업을 할 수 있다. 사용자 응답은 빨라야 하지만 정기 작업은 조금 오래 걸려도 되기 때문이다. 그래서 앞서 다룬 대량 배치 처리 같은 걸 크론으로 돌리기 좋다. 여유 있는 환경에서 무거운 일을 조금씩 처리하는 것이다.
크론 작업의 시간 관리도 신경 써야 한다. 무거운 작업은 트래픽 적은 시간에 돌려, 단일 스레드 특성상 사용자 요청과 경쟁하지 않게 한다. 또 여러 정기 작업이 한꺼번에 몰리지 않게 분산한다. 시간표를 잘 짜서 부하를 고르게 펴는 것이다. 정기 작업의 시간표 설계가 사이트 안정성에 영향을 준다.
5. 크론이 만드는 자동 운영
크론 트리거가 갖춰지면 사이트가 스스로 굴러가는 느낌이 든다. 통계는 알아서 집계되고, 캐시는 미리 채워지고, 쓰레기는 주기적으로 치워진다. 운영자가 매번 손대지 않아도 이런 유지 작업이 자동으로 돈다. 개인 개발자에게 이 자동 운영은 큰 도움이다.
이건 앞서 SEO 시리즈에서 강조한 자동화의 정신과 같다. 반복되는 일은 사람의 의지가 아니라 시스템이 하게 만드는 것이다. 정기 작업을 크론으로 자동화해두면, 운영자는 그 반복에서 벗어나 새 기능과 콘텐츠에 집중할 수 있다. 자동화가 개인 개발자의 시간을 지켜준다.
정리하면 크론 트리거는 서버 없이 정기 작업을 돌리는 도구로, 집계와 캐시 채우기와 정리에 쓰이고, 증분 처리와 시간 분산을 지키며, 사이트가 스스로 굴러가게 하는 자동 운영을 만든다. 여기까지가 저장소와 비동기 도구들이다. 다음 편부터는 운영과 최적화로 들어가, SSR 상태 코드를 정확히 다루는 기술부터 짚는다.
크론이 만드는 자동 운영이 개인 개발자에게 큰 도움이다. 통계는 알아서 집계되고, 캐시는 미리 채워지고, 쓰레기는 주기적으로 치워진다. 운영자가 매번 손대지 않아도 유지 작업이 자동으로 돈다. 반복되는 일은 사람의 의지가 아니라 시스템이 하게 만드는 것, 이 자동화가 개인의 시간을 지켜준다.
덧붙이면, 크론 작업도 로그로 확인하는 습관이 필요하다. 정기 작업은 사람이 안 보는 사이에 도니, 잘 돌고 있는지 로그로 확인하지 않으면 조용히 실패하고 있을 수 있다. 그래서 정기 작업이 예정대로 실행되고 정상 완료되는지 주기적으로 로그를 살핀다. 자동으로 돈다고 방치하면 언젠가 문제가 쌓인다.
다음 편부터는 운영과 최적화로 들어간다. 첫 주제는 서버 사이드 렌더링에서 상태 코드를 정확히 다루는 기술이다. 서버리스 구축과 SEO가 만나는 중요한 지점이다.