pile·
인프라 / DevOps·vercel-blogVercel Blog·

Turborepo, Go에서 Rust로 15개월 대이식 완료 — 7만 줄 마이그레이션 전 과정 공개

Vercel 팀이 Turborepo의 Go 코드베이스 약 7만 줄을 Rust로 이식하는 15개월 프로젝트를 마무리했다. 단순한 언어 전환이 아닌, Go Sandwich 아키텍처, 해시 안정성 문제, Capnproto 직렬화 도입 등 대규모 언어 마이그레이션에서 생기는 실제 공학적 도전을 상세히 기록했다.

핵심 포인트
  • 7만 줄 Go 코드를 15개월에 걸쳐 점진적으로 Rust로 이식했으며, Turborepo 1.11이 최초 전 Rust 버전으로 출시됐다
  • Go Sandwich 아키텍처로 Go와 Rust 컴포넌트가 공존하는 하이브리드 단계를 거쳐 점진적 이식이 가능했다
  • 언어 간 해시 동등성 보장을 위해 Capnproto 직렬화 포맷을 도입해 두 코드패스 결과를 바이트 단위로 비교·검증했다
  • Rust 타입 시스템으로 Go의 문자열 기반 타입을 enum으로 교체해 컴파일 타임 정확성을 확보했다
  • 사내 CI에서 실험적 Rust 코드패스를 72시간 도그푸딩한 뒤 카나리 릴리즈로 점진적 배포했다
상세 정리
  • 이식 동기: 성능 향상, 안정성 개선, 향후 Vercel DX 플랫폼과의 깊은 통합을 위해 Go에서 Rust로 전환 결정.
  • Go Sandwich 패턴: 초기에는 Go가 외부 인터페이스를 담당하고 내부 컴포넌트만 Rust로 교체하는 샌드위치 구조 채택. 점진적 이식을 가능하게 했지만, 비동기·멀티스레드 코드 경계에서 한계에 봉착.
  • 이식된 주요 컴포넌트: 패키지 그래프(의존성 관계), 프룬 명령(컨테이너화용 의존성 격리), 파일 해싱 시스템(캐시 비교용 지문 생성), 락파일 분석, 캐시 서명 검증.
  • 해시 안정성 문제: Go와 Rust가 동일 입력에 동일 해시를 출력하지 않으면 기존 사용자 캐시가 전부 무효화된다. 이를 해결하기 위해 Capnproto 도입.
  • Capnproto 도입: 크로스플랫폼 직렬화 포맷으로 바이트 단위 정의가 보장됨. CI에서 Go·Rust 양쪽 코드패스 결과를 비교해 미묘한 해시 불일치 버그를 조기에 발견.
  • Rust 타입 개선 예시: Go에서 워크스페이스 루트를 지칭하던 문자열 기반 특수값(//)을 Rust enum으로 교체 — 컴파일 타임에 잘못된 경로 사용을 차단.
  • 테스트 전략: --experimental-rust-codepath 플래그로 Rust 코드패스를 내부 CI에서 먼저 실행. 로그 줄 단위·출력 단위로 Go와 비교 후 72시간 내부 도그푸딩, 그 다음 카나리 릴리즈.
  • 회고 교훈: Capnproto를 처음부터 선택했어야 했고, JSON→Protobuf→Capnproto 반복으로 시간이 낭비됐다. 이식 전 코드 품질·문서화·테스트 강화가 이식 속도를 올린다.
  • 향후 계획: Rust 기반으로 Vercel DX 플랫폼, Conformance, Code Owners 기능을 엔터프라이즈 규모로 통합 예정.
왜 읽나대규모 Go-to-Rust 마이그레이션을 고려하거나, 빌드 도구·CLI 툴의 언어 이식 전략과 실전 함정을 알고 싶은 시스템 엔지니어·인프라 엔지니어.
vercel-blog
Vercel Blog 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 인프라 / 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로 완전 전환했다. 성능 문제가 아닌 관측성·유지보수성 한계가 동인이었으며, 마이그레이션 과정에서 플랫폼 한도를 직접 끌어올렸다.

    #durable-objects#workflows#cloudflare-workers+2
  2. 인프라 / DevOps·github-engGitHub Engineering·

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

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

    #github-actions#devops#supply-chain-security+2
  3. 인프라 / 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