Vercel이 수백만 개의 리디렉트 규칙을 초저지연으로 처리하는 CDN 라우팅 시스템의 아키텍처 진화 과정을 공개했다. JSON 파싱 기반 선형 검색에서 발생하는 CPU 경합 문제를 블룸 필터, 이진 검색, 샤딩 3단계 최적화로 해결했다.
핵심 포인트- 블룸 필터로 리디렉트가 불필요한 대부분의 요청을 O(1)에 처리한다. false negative가 없어 "확실히 없다"로 판별된 요청은 탐색 비용 없이 바로 통과시킨다.
- 기존 JSON 파싱이 CPU 집약적 경합의 원인이었다. 정렬된 키에 대한 이진 검색으로 교체해 파싱 오버헤드를 제거했다.
- 리디렉트 경로를 해싱해 여러 샤드로 분산했다. 각 요청이 해당 샤드만 조회해 프로세스 메모리 부담을 외부 저장소·파일시스템 캐시로 이전했다.
- JSONL 단일 파일→이진 검색→샤딩 3단계로 진화하며 프로덕션 데이터에 기반한 반복적 최적화를 보여준다.
- CPU 경합 제거 후 레이턴시 스파이크가 사라지고 예측 가능한 성능을 달성했다.
상세 정리- 초기 문제: 리디렉트 규칙이 2,000개 한도에 도달하는 고객들이 늘어나면서 더 많은 규칙을 처리하면서도 성능을 유지해야 했다.
- 1단계 JSONL + 블룸 필터: 리디렉트 규칙을 JSONL 형식으로 저장하고 블룸 필터를 함께 배포했다. 블룸 필터는 "결정적으로 없다" 또는 "아마 있다" 두 가지만 답해 대부분의 트래픽을 탐색 없이 처리한다.
- 블룸 필터 핵심 특성: false positive는 가능하지만 false negative는 없다. 리디렉트가 없는 경로는 블룸 필터에서 확실히 걸러지므로 JSONL 탐색 자체를 건너뛴다.
- 1단계 병목: JSONL 파일을 JSON으로 파싱하는 과정이 CPU를 집약적으로 사용했다. 여러 프로세스가 동시에 파싱하면서 CPU 경합이 발생해 레이턴시 스파이크가 나타났다.
- 2단계 이진 검색: 리디렉트 규칙을 정렬된 형태로 저장하고 이진 검색을 적용했다. JSON 파싱 단계 자체를 제거해 CPU 경합의 근본 원인을 없앴다.
- 3단계 샤딩: 리디렉트 경로를 해싱해 여러 샤드로 분산했다. 각 요청은 해당 샤드만 조회하면 되므로 전체 규칙 세트를 메모리에 유지할 필요가 없어졌다.
- 메모리 전략: 프로세스 인메모리 대신 외부 저장소와 파일시스템 캐시를 활용해 수백만 규칙도 처리 가능한 구조로 전환됐다.
- 결과: 레이턴시 스파이크 제거, 예측 가능한 성능 달성. 구체적 ms 수치는 공개되지 않았으나 CPU 경합 제거 전후 그래프로 명확한 개선을 시각화했다.
왜 읽나대규모 라우팅·리디렉트 시스템에서 블룸 필터와 이진 검색으로 CPU 경합을 해결한 CDN 아키텍처 최적화 패턴이 필요한 인프라·시스템 엔지니어에게 실전 레퍼런스다.