카카오메이커스, Next.js ISR과 Redis 외부 캐싱으로 SSR 부하 해결
핵심 내용
TPS 4.6배 향상과 응답 시간 4배 단축을 달성했으며, Nginx 정적 리소스 서빙으로 추가 최적화를 진행했다.
자세히 보기
카카오메이커스는 이벤트 서비스의 Next.js SSR 전환 후 카카오톡 채널 메시지 발송 시 발생하는 순간 트래픽 폭주로 서버 장애를 겪었다. 이를 해결하기 위해 **ISR(Incremental Static Regeneration)**과 Redis 외부 캐싱을 도입해 서버 부하를 줄이고 성능을 개선했다.
ISR 적용과 캐싱 전략
ISR은 정적 페이지를 필요할 때 부분적으로 재생성하는 방식으로, SSG의 성능과 SSR의 유연성을 동시에 제공한다. 카카오메이커스는 generateStaticParams를 활용해 정적 경로를 확정하고, revalidate 시간을 설정해 캐시를 관리했다. 특히 쿠키나 헤더 등 동적 API가 포함되면 ISR이 해제되므로, 개인화 데이터는 클라이언트에서 처리하도록 분리했다.
캐시 재검증은 시간 기반과 온디맨드 방식을 하이브리드로 사용했다. CMS 수정 시 revalidatePath를 호출해 캐시를 즉시 무효화하고, curl 기반 Prefetch 로직으로 실제 사용자 요청 전 캐시를 미리 채워 Thunder Herd 문제를 완화했다. 보안상 온디맨드 재검증 API는 사내망 IP로 제한했다.
Redis 도입과 운영 환경 최적화
PM2 클러스터 모드 운영 시 인스턴스 간 인메모리 캐시 불일치 문제를 해결하기 위해 Redis를 외부 공유 캐시로 도입했다. @neshca/cache-handler를 활용해 Redis를 Next.js 캐시 핸들러로 연결했으며, 이를 통해 여러 인스턴스가 동일한 캐시 데이터를 공유할 수 있게 됐다. 또한 정적 리소스는 CDN 대신 Nginx에서 직접 서빙하도록 설정해 네트워크 오버헤드를 줄이고 응답 속도를 개선했다.
성능 개선 결과 및 향후 과제
이러한 최적화를 통해 TPS는 4.6배 향상되고 응답 시간(MTT)은 4배 단축되었다. Nginx 정적 리소스 서빙만으로도 TPS 28% 향상과 응답 시간 36% 단축 효과를 거뒀다. 향후에는 Redis Pub/Sub을 활용해 인메모리 캐시 성능을 유지하면서 캐시 동기화 문제를 해결하고, 배포 시점의 Thunder Herd 문제를 보완하기 위해 빌드 시점 SSG 생성을 확대할 계획이다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.