pile·
프론트엔드·vercel-blogVercel Blog·

Black Friday-Cyber Monday 실시간 대시보드 구축기

Vercel이 자사의 Black Friday-Cyber Monday(BFCM) 실시간 대시보드를 어떻게 구축했는지 설명한다. 테라바이트 단위 데이터를 실시간으로 처리하면서도 수많은 방문자에게 부드러운 UI를 제공하는 게 핵심 과제였고, Next.js ISR + KV 캐싱 + 클라이언트 사이드 숫자 애니메이션으로 해결했다.

핵심 포인트
  • 10초 폴링 + ISR 5초 캐시로 DB 요청을 동시 방문자 수와 무관하게 1회/5초로 제한했다.
  • 테라바이트 DB를 매번 전체 조회하는 대신 5분 롤링 윈도우 + Upstash KV 누적 합산으로 쿼리 비용을 대폭 줄였다.
  • 숫자가 뚝뚝 바뀌는 UX를 requestAnimationFrame 기반 rate-of-change 애니메이션으로 부드럽게 만들고, 실제 값과 오차가 나면 rate를 동적으로 보정해 정확도를 유지했다.
  • ISR 덕분에 트래픽이 수배 늘어도 DB 부하는 일정하게 유지됐다.
상세 정리
  • 배경: 매년 BFCM 기간 수백만 명이 Vercel 인프라 실시간 지표를 공개 대시보드에서 동시에 보는 상황에서 최신 데이터를 효율적으로 제공해야 했다.
  • 폴링 아키텍처: 클라이언트가 10초마다 서버에 업데이트 요청. WebSocket 대신 단순 폴링을 선택해 확장성을 높이고 구현 복잡도를 낮췄다.
  • 초기 문제: BFCM 시작 시점부터 현재까지 전체 구간을 집계하면 시간이 지날수록 쿼리 비용이 기하급수적으로 증가했다.
  • 롤링 윈도우 + KV 합산: 최근 5분만 DB에서 조회하고, Upstash KV에 저장된 누적 카운트와 합산하는 방식으로 전환해 쿼리 비용을 일정하게 유지했다.
  • ISR 캐시 적용: Next.js `export const revalidate = 5` 설정으로 5초에 한 번만 DB를 조회하고, 그 사이 모든 방문자는 캐시 응답을 받는다. 동시 접속자가 아무리 늘어도 DB 부하가 증가하지 않는다.
  • 애니메이션 설계: 10초마다 숫자가 점프하면 UX가 나빠진다. 서버 사이드에서 초당 변화율을 계산해 내려주고, 클라이언트에서 requestAnimationFrame으로 매 프레임 조금씩 증가시켜 자연스럽게 보이게 했다.
  • 정확도 보정 메커니즘: rate 기반 증가를 하다 보면 실제 값과 오차가 누적된다. 퍼센트 차이를 계산해 오차가 임계값을 넘으면 rate를 동적으로 재조정해 정확도를 유지했다. 코드로 직접 구현 예시가 포함돼 있다.
  • 결과: 초당 수만 건 트래픽 상황에서도 DB 부하 안정 유지 + 부드러운 실시간 숫자 업데이트 제공.
왜 읽나대용량 실시간 대시보드에서 ISR 캐싱 + 폴링 + 클라이언트 애니메이션을 조합해 DB 비용과 UX 품질을 동시에 잡고 싶은 Next.js 개발자에게.
vercel-blog
Vercel Blog 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 프론트엔드·여기어때 (GC컴퍼니)여기어때 (GC컴퍼니)·

    항공 프론트엔드 구축기 (7/10): 창구를 하나만 두었습니다

    여기어때 항공 서비스 프론트엔드가 웹과 앱 웹뷰 두 환경에서 동일한 함수 호출로 동작하는 앱 브릿지 추상화 레이어를 설계한 과정을 다룬다. iOS·안드로이드 규약 차이와 "웹에 존재하지 않는 브릿지를 어떻게 호출하나"라는 문제를 단일 추상화 층으로 해결한 구현 사례다.

    요약 이어보기
    #react#typescript#webview+2