pile·
인프라 / DevOps·cloudflare-blogCloudflare Blog·

대규모 도그푸딩: cdnjs를 Cloudflare 개발자 플랫폼으로 이전하다

cdnjs는 하루 90억 요청을 처리하는 오픈소스 JS/CSS CDN으로, 전 세계 웹사이트의 12%가 의존한다. 2026년 6월, Cloudflare는 6년간 GCP에서 운영하던 발행 파이프라인을 Workers, Workflows, R2, KV, Queues, Containers, Durable Objects로 완전 전환했다. 성능 문제가 아닌 관측성·유지보수성 한계가 동인이었으며, 마이그레이션 과정에서 플랫폼 한도를 직접 끌어올렸다.

핵심 포인트
  • 기존 GCP 파이프라인의 5대 고통: 공통 추적 ID 없음, KV+GitHub 이중 스토리지 split-brain, GCS 이벤트 기반 함수 체인, 알파벳별 26개 Cloud Function, GitHub 감당 불가 1.1TB 리포
  • 새 아키텍처 원칙: R2가 단일 파일 SSOT, KV는 메타데이터·SRI 해시 전용, Workflows로 내구성 있는 다단계 파이프라인 구현
  • 압축 같은 CPU 집약 작업은 Cloudflare Containers의 Rust 서비스에 오프로드, R2 이벤트 알림으로 Workflow를 재개하는 비동기 패턴 채택
  • 수천 개 자식 Workflow 완료를 Durable Object 카운터로 집계해 부모 Workflow 재개 트리거
  • 마이그레이션 시 파일 재생성 대신 as-is 복사 선택 — 미니파이어 비결정성으로 SRI 해시 불일치 발생, 롤백 후 전략 변경
  • 한도 돌파: Worker 서브요청 1,000→1,000만, Workflow 스텝 1,024→10,000으로 상향 (cdnjs 요청으로 플랫폼 전체 적용)
상세 정리
  • 배경: 2020년 파일 서빙은 Workers+KV로 이전했지만 발행 파이프라인은 GCP Functions+VM+GitHub 유지, 기능 추가 시 GCP·Cloudflare 양쪽 배포 조율 필요
  • 고통 1 관측성: GCP Logging과 Cloudflare Logpush 간 공통 상관 ID 없음 → KV에 반영됐지만 GitHub에 누락된 버전을 자동 탐지 불가
  • 고통 2 스토리지: KV(엣지 서빙)와 GitHub 리포(소스 진실)가 각각 파일 보관, drift 발생 시 정합 수단 없음
  • 고통 3 파이프라인: GCS 버킷 이벤트로 함수를 체인 연결, DLQ·백로그 가시성 없어 스텝 실패 시 재실행 복잡
  • 고통 4 샤딩 과부하: npm 업데이트 확인에 알파벳 한 글자씩 26개 Cloud Function 운영 → 26개 별도 배포·로그
  • 고통 5 GitHub 과부하: 1.1TB 리포로 아카이브 생성 불가, fork 느림, .gitignore 274개 수동 관리
  • 새 파이프라인: 10분마다 cron이 PackageUpdatesWorkflow 기동 → 새 버전별 DownloadPackageWorkflow → 파일별 ProcessingWorkflow(병렬) → PublishingWorkflow(R2·KV·Algolia 인덱스 기록)
  • 압축 오프로드 패턴: ProcessingWorkflow가 비압축 파일을 R2에 저장, Queue에 잡 전송 후 hibernate → 컨테이너 Rust 서비스가 압축 완료 후 결과 R2 저장 → R2 이벤트 알림이 Workflow 재개
  • 자식 동기화: 파일 수천 개를 병렬 처리 시 Durable Object를 카운터로 사용 — 부모가 자식 수만큼 증가, 자식 완료 시 감소, 0이 되면 부모 Workflow 재개
  • 마이그레이션 롤백 교훈: 파일 재생성 시도 시 미니파이어·압축기 버전 차이로 SRI 해시 불일치 → 사용자 integrity 검증 실패 위험으로 롤백
  • 복사 전략: 기존 KV 파일을 R2로 as-is 이동, Worker 서브요청 한도 1,000이 병목 → Queues로 패키지 단위 샤딩하여 우회
  • 한도 돌파: 서브요청 1,000 한도와 Workflow 스텝 1,024 한도 직접 도달 → 팀에 요청해 각각 1,000만·10,000(최대 25,000)으로 상향 — 플랫폼 전체 혜택
  • 재해복구: R2 ↔ DigitalOcean Spaces 실시간 미러, 서빙 체인은 Workers Cache → R2 → DigitalOcean 순 fallback
왜 읽나Cloudflare Workers·Workflows·Containers 조합으로 대규모 비동기 파이프라인을 구축하거나 GCP에서 Cloudflare 개발자 플랫폼으로 이전을 검토하는 인프라·백엔드 엔지니어에게 플랫폼 한도·함정·해결 패턴을 보여주는 실전 레퍼런스다.
cloudflare-blog
Cloudflare Blog 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 인프라 / DevOps·github-engGitHub Engineering·

    Dependabot 길들이기: 업데이트 묶고, 주기 늦추고, 보안은 빠르게

    GitHub의 Dependabot은 의존성 업데이트를 자동화하지만, 기본 설정에서는 10개 업데이트 = 10개 PR이 쏟아져 메인테이너가 알림을 무시하게 된다. Microsoft의 GCToolkit 사례(578개 커밋 중 92개가 Dependabot 버전 범프)를 바탕으로, 그룹핑·주기 조절·보안 업데이트 분리 3가지 설정으로 노이즈를 줄이면서 보안 속도는 유지하는 방법을 다룬다.

    #github-actions#devops#supply-chain-security+2
  2. 인프라 / DevOps·cloudflare-blogCloudflare Blog·

    Cloudflare, 프라이버시 프로토콜 디버깅 CLI pvcli 오픈소스 공개

    Cloudflare가 OHTTP(Oblivious HTTP) 등 프라이버시 보존 프로토콜 디버깅을 위한 CLI 도구 pvcli를 오픈소스(Apache-2.0)로 공개했다. 기존에는 RFC를 참조하며 바이너리를 수작업으로 파싱해야 했는데, pvcli는 curl과 유사한 문법으로 이 과정을 단일 명령으로 줄인다. Apple Private Relay·Microsoft Edge Secure Network를 구동하는 실전 규모의 경험에서 나온 도구다.

    #rust#cli#ohttp+2