피그마 내부 이야기: 내부 웹 (새 탭에서 열림)
피그마는 웹 기반 디자인 도구로서 실시간 협업의 복잡성을 해결하기 위해 단일 모놀리스에서 정교한 분산 시스템으로 인프라를 확장해 왔습니다. 이들은 클라이언트측의 WebAssembly 성능과 백엔드의 안정적인 데이터 동기화 메커니즘을 결합하여, 전 세계 수백만 사용자가 동시에 지연 없이 작업할 수 있는 환경을 구축했습니다. 결과적으로 피그마의 기술적 성공은 화려한 기술의 도입보다는 실제 서비스 성장에 맞춘 실용적인 아키텍처 진화와 지속적인 최적화에 뿌리를 두고 있습니다. ### 실시간 협업을 위한 Multiplayer 서버 아키텍처 * 피그마의 핵심은 'Multiplayer'라고 불리는 상태 유지형(Stateful) 서버 시스템입니다. * 사용자가 파일을 열면 특정 서버 프로세스에 할당되며, 클라이언트는 WebSocket을 통해 이 서버와 실시간으로 통신합니다. * 서버는 문서의 현재 상태를 메모리에 유지하면서 여러 사용자의 편집 요청을 순서대로 처리하고, 변경 사항을 즉각적으로 모든 참여자에게 전파하여 충돌을 방지합니다. ### 데이터베이스 확장과 Vitess 도입 * 초기에는 단일 PostgreSQL 인스턴스로 시작했으나, 데이터 사용량이 폭증함에 따라 데이터베이스 확장성 한계에 직면했습니다. * 이를 해결하기 위해 데이터를 논리적으로 나누는 수직 분할(Vertical Partitioning)을 거쳐, 최종적으로는 수평 샤딩(Horizontal Sharding)으로 전환했습니다. * 이 과정에서 YouTube에서 개발한 오픈소스 데이터베이스 클러스터링 시스템인 'Vitess'를 도입하여, 애플리케이션 코드의 수정 없이도 수만 개의 샤드를 효율적으로 관리할 수 있는 구조를 만들었습니다. ### 성능 극대화를 위한 WebAssembly와 C++ 엔진 * 피그마의 그래픽 렌더링 엔진은 성능 극대화를 위해 C++로 작성되었으며, 이를 WebAssembly(Wasm)로 컴파일하여 브라우저에서 실행합니다. * 이는 일반적인 JavaScript 환경보다 훨씬 빠른 연산 속도를 제공하며, 대규모 디자인 파일에서도 데스크톱 앱 수준의 부드러운 사용자 경험을 보장합니다. * 클라이언트와 서버가 동일한 동기화 로직을 공유할 수 있도록 설계하여, 복잡한 협업 시나리오에서도 데이터의 정합성을 유지합니다. ### 시스템 신뢰성을 보장하는 시뮬레이션 테스트 * 동시성 문제가 발생하기 쉬운 실시간 환경의 특성을 고려하여, '결정론적 시뮬레이션(Deterministic Simulation)' 테스트를 수행합니다. * 수천 명의 가상 사용자가 무작위로 편집을 수행하거나 네트워크 지연이 발생하는 극한의 상황을 재현하여 시스템의 안정성을 검증합니다. * 이러한 철저한 테스트 자동화 덕분에 복잡한 인프라 변경이나 기능 업데이트 시에도 사용자 데이터 손실 없이 안정적인 서비스를 유지할 수 있습니다. ### 점진적 진화와 관찰 가능성(Observability) * 피그마는 초기부터 완벽한 시스템을 설계하기보다 서비스 규모에 맞춰 인프라를 단계적으로 개선하는 전략을 취했습니다. * 모든 시스템 구성 요소에 상세한 로깅과 대시보드를 구축하여, 장애가 발생하기 전 징후를 파악하고 신속하게 대응할 수 있는 환경을 조성했습니다. * 인프라 부서는 단순히 서버를 운영하는 것을 넘어, 제품 엔지니어가 확장성 고민 없이 기능을 개발할 수 있도록 추상화된 플랫폼을 제공하는 데 집중합니다. 피그마의 사례는 서비스 초기부터 오버엔지니어링을 하기보다, 병목 지점을 정확히 파악하고 적시에 Vitess나 WebAssembly 같은 핵심 기술을 도입하는 것이 얼마나 중요한지 보여줍니다. 실시간 협업 서비스를 설계한다면 상태 유지형 서버의 안정성과 데이터베이스 샤딩 전략을 최우선으로 고려할 것을 추천합니다.