distributed-systems

15 개의 포스트

나의 에어비앤비 입 (새 탭에서 열림)

안나 술키나(Anna Sulkina)는 20년 이상의 경력을 가진 엔지니어링 리더로, 하드웨어 진단에서 시작해 프론트엔드와 백엔드를 거쳐 현재 에어비앤비의 인프라 및 클라우드 부문을 이끌고 있습니다. 그녀는 트위터 재직 당시 대규모 분산 시스템의 기술적 한계를 극복하고 조직적 합의를 통해 GraphQL 도입을 성공시킨 경험을 바탕으로, 기술적 역량과 리더십의 조화를 강조합니다. 현재 그녀는 에어비앤비에서 개발자 플랫폼의 전략적 방향성을 설정하고 고성과 팀을 구축하여 비즈니스 가치를 극대화하는 데 전념하고 있습니다. ### 기술적 호기심의 시작과 초기 경력의 도전 * 소련 붕괴 시기 우크라이나에서 성장하며, 컴퓨터 하드웨어를 조립하던 오빠의 영향으로 기술에 대한 호기심을 키웠습니다. * 미국 이주 초기에는 프로그래밍 언어보다 영어 소통에 더 큰 어려움을 겪었으나, 버클리 익스텐션 등을 통해 C++과 Java 지식을 확장하며 전문성을 쌓았습니다. * 첫 직장인 하드웨어 진단 분야를 시작으로 기술 스택의 아래 단계로 점진적으로 내려가며 하드웨어, 프론트엔드, 백엔드를 아우르는 폭넓은 시각을 갖게 되었습니다. ### 리더십으로의 전환과 팀 구축의 즐거움 * 개인 기여자(IC)로서의 역량뿐만 아니라 리더십 잠재력을 인정받아 텔레콤 스타트업과 컴캐스트(Comcast)를 거치며 엔지니어링 매니저로 성장했습니다. * 좋은 리더가 있는 팀과 그렇지 않은 팀의 차이를 직접 목격하며 사람을 코칭하고 고성과 팀을 만드는 과정에서 큰 흥미를 느꼈습니다. * 기술 스택의 깊이가 깊어질수록 리더십의 책임 또한 커지는 궤적을 그리며 인프라 부문의 리더로 자리매김했습니다. ### 트위터에서의 분산 시스템 설계와 기술 혁신 * 약 9년 동안 트위터에 재직하며 'Fail Whale' 시기와 엘런 디제너러스의 셀카 사건 등 대규모 트래픽 장애를 해결하는 핵심적인 역할을 수행했습니다. * **실패를 위한 설계:** 모놀리스 구조에서 마이크로서비스 아키텍처로 전환하며, 복잡한 분산 시스템에서는 실패를 피하는 것이 아니라 '실패를 대비한 설계'가 필수적임을 배웠습니다. * **합의를 통한 혁신:** 해커톤에서 시작된 GraphQL 도입을 위해 전사적인 기술적 합의를 이끌어냈으며, 이는 기존 REST 서비스를 대체하고 제품 개발 속도를 획기적으로 높이는 결과로 이어졌습니다. ### 에어비앤비에서의 전략적 정렬과 플랫폼 고도화 * 평소 여행을 좋아하고 에어비앤비 서비스의 팬이었던 점이 이직의 결정적 계기가 되었으며, 개인적 관심사와 기술적 전문성을 일치시켰습니다. * **개발자 플랫폼 개선:** 파편화되어 있던 개발자 플랫폼 조직의 전략을 명확히 하고, 내부 이해관계자들과의 신뢰를 구축하는 데 집중했습니다. * **조직적 정렬:** "우리는 왜 여기에 모였는가?"와 같은 근본적인 질문에 답하며 리더십 코칭과 팀 간 정렬을 통해 비즈니스 가치를 창출하는 고성과 조직을 재정비했습니다. 안나 술키나의 여정은 복잡한 시스템일수록 기술적 완벽주의보다는 실패를 수용하는 유연한 설계가 중요하다는 점을 시사합니다. 또한, 기술적 혁신은 단순히 뛰어난 코드로 완성되는 것이 아니라, 조직 내의 합의를 이끌어내고 구성원들의 목표를 하나로 정렬하는 리더십을 통해 비로소 실현될 수 있음을 보여줍니다.

기획부터 개발까지 전부 직접 했습니다 – 우테코 7기 크루 서비스 론칭! | 우아한형제들 기술블로그 (새 탭에서 열림)

우아한테크코스 7기 크루들이 기획부터 디자인, 개발 및 운영까지 전 과정을 직접 수행하며 실제 사용자를 위한 서비스를 성공적으로 론칭했습니다. 이번 프로젝트는 단순한 기술 습득을 넘어 개발자가 왜 기획과 디자인에 참여해야 하는지, 그리고 사용자 피드백이 아키텍처와 도메인 설계에 어떤 영향을 미치는지 몸소 체험하는 과정이었습니다. 결과적으로 크루들은 2주 단위의 스프린트와 실시간 모니터링, 배포 환경 구축 등 실무에 근접한 경험을 통해 현장 중심의 문제 해결 역량을 갖춘 개발자로 성장했습니다. **개발자 중심의 기획과 협업 문화의 정착** - 우아한테크코스는 레벨 3, 4 과정을 통해 개발자가 직접 기획과 디자인을 포함한 서비스의 전주기를 책임지는 팀 프로젝트를 진행합니다. - 기술적인 구현뿐만 아니라 말하기, 글쓰기 교육을 병행하여 팀원 간의 의견 조율 및 설득 등 소프트 스킬의 중요성을 강조합니다. - 아키텍처 설계와 같은 기술적 결정이 팀의 목표와 사용자의 가치에 어떻게 부합해야 하는지 고민하며 개발자의 역할을 확장했습니다. **픽잇(Pickeat): 취향과 제약을 반영한 협업형 식사 선택 서비스** - "아무거나"라는 답변 뒤에 숨겨진 기피 음식과 다이어트 등의 제약 사항을 실시간 투표로 해결하여 최적의 식당을 추천합니다. - 위치 정보 기반의 식당 자동 조회 및 템플릿 기능을 도입하여 반복되는 회식이나 미팅 시 의사결정 속도를 높였습니다. - 데모데이와 홍보를 통해 받은 피드백을 바탕으로 UI와 백엔드 도메인 구조를 유연하게 재설계하며 사용자 중심의 반복적인 개선 과정을 거쳤습니다. **보따리(Bottari): 실시간 동기화 기반의 상황별 체크리스트** - 출근, 여행, 이사 등 다양한 상황에 맞춘 템플릿 기반 리스트 생성과 팀 단위의 실시간 협업 체크 기능을 제공합니다. - 단순한 기능 구현을 넘어 사용자가 물건을 잊지 않게 돕는 알림 타이밍과 체크 상태 동기화 등 사용자 경험(UX)의 세부 요소를 정밀하게 다듬었습니다. - '기술은 문제를 해결하는 도구'라는 철학 아래 사용자가 안심하고 기억을 맡길 수 있는 흐름을 구현하는 데 집중했습니다. **커피빵(Coffee Bread): 웹소켓 기반의 실시간 내기 미니게임** - 가위바위보보다 더 큰 재미와 긴장감을 주기 위해 실시간 미니게임과 가중치 적용 룰렛 시스템을 도입한 서비스입니다. - 웹소켓(WebSocket) 기술과 분산 환경이라는 기술적 난제를 극복하며 실시간 상호작용이 끊김 없이 이루어지도록 개발했습니다. - 게임의 공정성과 재미를 위해 룰렛 알고리즘을 수차례 수정하고, 실제 사용자들의 피드백을 반영해 밸런스를 최적화했습니다. 이 서비스들은 단순한 교육용 프로젝트를 넘어 실제 배포와 운영을 거치며 기술적 완성도를 높였습니다. 개발자가 기획 단계부터 깊이 관여할 때 사용자에게 더욱 가치 있는 프로덕트가 탄생한다는 점을 시사하며, 실무적인 문제 해결 역량을 키우고 싶은 주니어 개발자들에게 좋은 협업의 귀감이 됩니다.

미래를 구축하다: Dropbox (새 탭에서 열림)

드롭박스는 2025년 여름 인턴십 프로그램을 통해 43명의 인턴과 함께 AI 기반 통합 검색 도구인 '드롭박스 대시(Dropbox Dash)'를 비롯한 핵심 서비스의 성능과 인프라를 혁신했습니다. 엔지니어링 중심의 이번 기수들은 12주간 멘토링과 실무 프로젝트에 참여하며, 특히 AI 모델의 신뢰성 강화와 다국어 검색 지원 등 드롭박스의 차세대 기술 역량을 끌어올리는 데 기여했습니다. 결과적으로 이번 프로그램은 인턴들에게는 실질적인 기술적 성장을, 기업에는 레거시 시스템 현대화와 운영 효율화라는 실용적 성과를 동시에 안겨주었습니다. ### 드롭박스 대시와 AI 기술 고도화 * **다국어 검색 지원 확대**: 통합 검색 플랫폼(USP)에 언어 감지 파이프라인을 통합하여 리플레이(Replay) 등 드롭박스 제품 전반에 걸쳐 20개 이상의 언어를 지원하는 네이티브 검색 환경을 구축했습니다. * **ML 모델 모니터링 시스템(AI Sentinel)**: 머신러닝 엔지니어가 수동으로 확인하던 모델 배포 상태를 실시간으로 가시화하는 시스템을 개발하여 배포의 신뢰성을 높이고 반복 주기를 단축했습니다. * **커넥터 플랫폼 최적화**: 대시의 데이터 저장소에서 최신 정보에 직접 접근할 수 있는 도구를 빌드하여, 외부 시스템의 데이터를 매번 다시 다운로드하지 않고도 최신 메타데이터 기반으로 모델을 학습시킬 수 있게 했습니다. * **문서 미리보기 및 웹 자동화**: 대시 내에서 문서를 즉시 미리 볼 수 있는 UI와 대화형 AI 기능을 통합하고, 폼 채우기나 교정 등의 반복 업무를 자동화하는 모듈형 AI 에이전트를 개발했습니다. ### 인프라 성능 및 데이터 효율화 * **스토리지 코어(Magic Pocket) 지연 시간 단축**: 디스크 재시작 시 발생하는 쓰기 지연 문제를 해결하기 위해 스토리지 상태를 추적하는 캐시와 성능이 저하된 볼륨을 제외하는 필터링 옵션을 추가하여 검색 결과의 정확도를 높였습니다. * **파일 시스템 메타데이터 리팩토링**: 레거시 파일 이력 추적 시스템을 현대화하여 메타데이터 인프라를 단순화하고 운영 비용을 대폭 절감했습니다. * **대규모 데이터 분석 최적화**: Databricks 쿼리와 ETL 파이프라인의 고비용 패턴을 식별하는 추천 시스템을 구축하고, 500TB 규모의 모바일 이벤트 로그를 최신 데이터 레이아웃 기술인 '리퀴드 클러스터링(Liquid Clustering)'으로 마이그레이션했습니다. ### 개발자 경험 및 운영 도구 개선 * **AI 기반 코드 마이그레이션**: 특정 폴더나 유형에 대해 코드 마이그레이션을 자동화하고 결과가 성공적일 경우 자동으로 Pull Request를 생성하는 도구를 제작하여 대규모 마이그레이션 작업을 효율화했습니다. * **지능형 지표 감지 시스템(Vortex2)**: 고정된 임계값 대신 데이터의 계절성과 변화 패턴을 학습하는 적응형 이상 탐지 기법을 도입하여 알림 피로도를 줄이고 장애 대응 속도를 개선했습니다. 이러한 인턴들의 성과는 드롭박스가 단순한 파일 저장소를 넘어 AI 중심의 워크플로우 플랫폼으로 진화하고 있음을 보여줍니다. 특히 대규모 마이그레이션 자동화나 인프라 수준의 지연 시간 최적화와 같은 실무적인 기술 해결책은 엔지니어링 팀의 생산성을 직접적으로 높이는 실용적인 결론을 도출했습니다.

네이버 TV (새 탭에서 열림)

Apache Kafka의 차세대 소비자 그룹 프로토콜(Consumer Group Protocol v2)은 기존 v1 프로토콜이 가진 리밸런싱 성능의 한계와 복잡성을 근본적으로 해결하기 위해 도입되었습니다. 새로운 프로토콜은 리밸런싱 로직의 주체를 클라이언트에서 서버(Broker)로 옮겨 전체적인 시스템 안정성을 높였으며, 대규모 클러스터 운영 시 발생하던 중단 시간을 획기적으로 단축했습니다. 이 글은 네이버의 실무 경험을 바탕으로 v2의 주요 특징과 성능 개선 사항, 그리고 안정적인 마이그레이션 전략을 제시합니다. **기존 Consumer Group Protocol v1의 문제점** * **Stop-the-world 리밸런싱:** 리밸런싱이 발생하면 모든 컨슈머가 데이터 처리를 멈추고 파티션을 재할당받아야 하므로 일시적인 처리 지연이 불가피했습니다. * **클라이언트 측의 과도한 부담:** 리밸런싱 로직이 컨슈머 클라이언트에 포함되어 있어, 클라이언트 수가 늘어날수록 통신량과 계산 복잡도가 급증하는 구조적 한계가 있었습니다. * **디버깅의 어려움:** 리밸런싱 과정이 복잡하고 클라이언트별로 상태가 달라 문제 발생 시 원인 파악과 모니터링이 까다로웠습니다. **Consumer Group Protocol v2의 핵심 특징과 장점** * **서버 중심 리밸런싱:** 그룹 코디네이터(Broker)가 파티션 할당 로직을 직접 수행하여 클라이언트의 계산 부하를 줄이고 전체 프로세스를 단순화했습니다. * **점진적 협력 리밸런싱:** 모든 컨슈머를 멈추지 않고, 변경이 필요한 파티션만 점진적으로 재할당하여 서비스 가용성을 극대화했습니다. * **하트비트 메커니즘 개선:** 하트비트 응답 내에 리밸런싱 명령을 포함시켜 별도의 JoinGroup/SyncGroup 절차 없이도 빠른 상태 동기화가 가능해졌습니다. **성능 향상 및 운영 효율화** * **확장성 강화:** 수천 개의 파티션과 수백 명의 컨슈머가 참여하는 대규모 그룹에서도 리밸런싱 시간을 일관되게 유지합니다. * **불필요한 리밸런싱 감소:** 컨슈머의 일시적인 네트워크 순단이나 짧은 지연에 대해 보다 유연하게 대응하여 불필요한 그룹 재편성을 방지합니다. * **전용 툴 지원:** 새로운 프로토콜에 최적화된 모니터링 툴과 API를 통해 소비자 그룹의 상태를 더 정밀하게 확인하고 관리할 수 있습니다. **성공적인 마이그레이션 및 설정 가이드** * **호환성 확인:** Kafka 브로커와 클라이언트 버전을 확인하여 v2 프로토콜(KIP-848) 지원 여부를 먼저 점검해야 합니다. * **단계적 도입:** `group.protocol` 설정을 통해 기존 v1과 새로운 v2를 선택적으로 적용할 수 있으며, 개발 환경에서 충분한 검증 후 운영 환경에 반영하는 것이 권장됩니다. * **클라이언트 업데이트:** v2의 이점을 온전히 누리기 위해서는 브로커뿐만 아니라 컨슈머 클라이언트 라이브러리 역시 최신 버전으로 업그레이드해야 합니다. 대규모 트래픽을 처리하며 리밸런싱으로 인한 지연 시간에 민감한 서비스라면 Kafka 3.x 후반대 버전부터 도입된 Consumer Group Protocol v2로의 전환을 적극적으로 검토해야 합니다. 특히 컨슈머 그룹의 규모가 크거나 빈번한 배포가 일어나는 환경일수록 v2 도입을 통한 운영 안정성 향상 효과가 더욱 뚜렷하게 나타날 것입니다.

넷플릭스가 실시간 분산 그래프를 구축한 방법과 이유: 1부 — 인터넷 규모의 데이터 스트림 수집 및 처리 (새 탭에서 열림)

넷플릭스는 비디오 스트리밍을 넘어 광고, 라이브 이벤트, 모바일 게임으로 비즈니스를 확장하면서 발생하는 데이터 파편화 문제를 해결하기 위해 '실시간 분산 그래프(RDG)'를 구축했습니다. 기존 마이크로서비스 아키텍처에서 발생하는 데이터 고립을 극복하고, 다양한 서비스 접점에서 발생하는 사용자 활동을 실시간으로 연결하여 개인화된 경험을 제공하는 것이 핵심 목표입니다. 이를 통해 복잡한 데이터 조인 없이도 수억 개의 노드와 엣지 사이의 관계를 즉각적으로 파악할 수 있는 기술적 기반을 마련했습니다. **데이터 파편화와 비즈니스 환경의 변화** * 스트리밍, 게임, 라이브 스포츠 등 서비스 영역이 넓어지면서 사용자가 여러 기기와 도메인에서 수행하는 활동을 하나의 맥락으로 통합해야 할 필요성이 커짐. * 넷플릭스의 강점인 마이크로서비스 아키텍처(MSA)는 서비스 독립성에는 유리하지만, 데이터가 각 서비스에 고립(Silo)되어 있어 통합적인 데이터 과학 및 엔지니어링 작업에 큰 비용이 발생함. * 기존 데이터 웨어하우스 방식은 데이터가 서로 다른 테이블에 저장되고 처리 주기가 제각각이라, 실시간으로 연관 관계를 분석하는 데 한계가 있음. **그래프 모델 도입의 기술적 이점** * **관계 중심 쿼리:** 테이블 기반 모델에서 필요한 비용 중심적인 조인(Join)이나 수동적인 비정규화 없이도 노드와 엣지 사이를 빠르게 탐색(Hop)할 수 있음. * **유연한 확장성:** 새로운 엔티티나 관계 유형이 추가될 때 대대적인 스키마 변경이나 아키텍처 재설계 없이도 신속하게 데이터 모델을 확장할 수 있음. * **패턴 및 이상 탐지:** 숨겨진 관계, 순환(Cycle) 구조, 그룹화 등을 식별하는 작업을 기존의 포인트 조회 방식보다 훨씬 효율적으로 수행함. **실시간 데이터 수집 및 처리 파이프라인 (RDG 레이어 1)** * 전체 시스템은 수집 및 처리, 저장, 서빙의 3개 레이어로 구성되며, 첫 번째 단계인 수집 레이어는 이기종 업스트림 소스로부터 이벤트를 받아 그래프 데이터를 생성함. * DB의 변경 사항을 추적하는 CDC(Change Data Capture)와 애플리케이션의 실시간 로그 이벤트를 주요 소스로 활용하여 데이터 소외 현상을 방지함. * 수집된 원시 데이터는 스트리밍 처리 엔진을 통해 그래프 스키마에 맞는 노드와 엣지 형태로 변환되며, 대규모 트래픽 환경에서도 실시간성을 유지하도록 설계됨. 복잡하게 얽힌 현대의 서비스 환경에서 데이터 간의 관계를 실시간으로 규명하는 것은 사용자 경험 고도화의 핵심입니다. 넷플릭스의 RDG 사례처럼 파편화된 마이크로서비스의 데이터를 그래프 형태로 통합하는 접근 방식은, 실시간 통찰력이 필요한 대규모 분산 시스템 설계 시 강력한 해결책이 될 수 있습니다.

스트림 뒤편: 라이브 이벤트를 위한 실시간 추천 3부 | 넷플릭스 기술 블로그 | 넷플릭스 테크블로그 (새 탭에서 열림)

넷플릭스는 수천만 명의 시청자가 동시에 접속하는 라이브 이벤트 상황에서 시스템 과부하를 방지하면서도 실시간 개인화 추천을 제공하기 위해 '프리페칭(Prefetching)'과 '실시간 브로드캐스팅'이라는 2단계 전략을 도입했습니다. 이 시스템은 이벤트 시작 전 미리 데이터를 기기에 저장해 두었다가, 실제 시작 시점에는 최소한의 신호만 보내 로컬에서 추천 정보를 활성화함으로써 '천둥 번개 효과(Thundering Herd)' 문제를 효과적으로 해결합니다. 이를 통해 넷플릭스는 클라우드 자원을 무리하게 확장하지 않고도 전 세계 수억 대의 기기에 지연 없는 실시간 스트리밍 경험을 제공할 수 있게 되었습니다. **라이브 이벤트와 시동 시간의 제약** * VOD와 달리 라이브 이벤트는 모든 시청자가 특정 시점에 동시에 접속하므로, 짧은 시간 내에 수억 개의 기기에 업데이트를 전달해야 하는 기술적 난관이 존재합니다. * 단순히 서버를 증설하는 선형적 확장은 비효율적이며, 다른 핵심 서비스의 자원을 고갈시킬 위험이 있습니다. * 성공적인 실시간 추천을 위해서는 업데이트 소요 시간(Time), 서비스 처리 용량(Request Throughput), 요청의 다양성(Compute Cardinality)이라는 세 가지 제약 조건을 동시에 최적화해야 합니다. **프리페칭을 통한 트래픽 분산** * 이벤트 시작 전 사용자가 평소처럼 앱을 탐색하는 동안, 라이브 이벤트와 관련된 메타데이터, 아트워크, 개인화된 추천 리스트를 미리 기기 캐시에 저장합니다. * 이를 통해 서버 요청을 시간에 따라 자연스럽게 분산시켜, 이벤트 직전 발생하는 트래픽 스파이크를 제거하고 시스템 안정성을 확보합니다. * 서버 측에서 미리 계산된 '구체화된 추천(Materialized Recommendations)'을 제공함으로써 기기별 요청의 복잡도를 낮춥니다. **저카디널리티 실시간 브로드캐스팅** * 이벤트가 실제로 시작되거나 일정이 변경될 때, 넷플릭스의 푸시 서비스(Zuul Push)를 통해 연결된 모든 기기에 '저카디널리티(Low-cardinality)' 메시지를 전송합니다. * 이 메시지는 복잡한 데이터를 담지 않고 단순히 미리 캐싱된 데이터를 화면에 표시하라는 트리거 역할만 수행하여 네트워크 부하를 최소화합니다. * '최소 한 번(At-least-once)' 전달 방식을 채택하여 네트워크 상태가 불안정한 기기도 다시 온라인 상태가 되면 누락된 업데이트를 즉시 따라잡을 수 있도록 설계되었습니다. **데이터 기반의 동적 적응** * 라이브 이벤트의 특성상 경기 시간이 지연되거나 일정이 변동될 수 있는데, 브로드캐스팅 시스템은 이러한 실시간 제작 상황에 맞춰 전송 타이밍을 동적으로 조절합니다. * 수천만 대의 기기가 동시에 서버에 데이터를 재요청하는 대신 로컬 데이터를 활용하게 함으로써, 전 세계 모든 사용자가 동일한 순간에 일관된 추천 UI를 볼 수 있게 합니다. 라이브 이벤트와 같은 초고부하 상황에서는 무조건적인 서버 증설보다는 클라이언트의 로컬 자원을 활용하고 서버 부하를 시간적으로 분산하는 아키텍처가 필수적입니다. 실시간성이 중요한 서비스라면 모든 데이터를 실시간으로 전송하기보다, 정적인 데이터는 미리 배치하고 상태 변화를 알리는 최소한의 신호만 실시간으로 처리하는 하이브리드 접근 방식을 권장합니다.

에어비앤비의 키-값 저장소에서 정적 속도 제한에서 적응형 트래픽 관리로 (새 탭에서 열림)

에어비앤비는 분산 키-밸류 저장소인 'Mussel'의 트래픽 관리 방식을 단순 요청 횟수 제한(QPS)에서 자원 기반의 적응형 제어 시스템으로 진화시켰습니다. 이 시스템은 요청의 실제 비용을 계산하는 자원 인식형 속도 제한(RARC)과 우선순위 기반의 부하 차단(Load Shedding) 계층을 도입하여 시스템의 유용 작업량(Goodput)을 극대화합니다. 결과적으로 Mussel은 예기치 못한 트래픽 급증이나 DDoS 공격 상황에서도 핵심 서비스의 성능을 안정적으로 유지할 수 있게 되었습니다. ### 정적 QPS 제한의 한계와 자원 인식형 제어(RARC)의 도입 기존의 단순 QPS 제한 방식은 요청의 복잡도와 상관없이 동일한 할당량을 차감했기에 효율적인 자원 관리가 불가능했습니다. * **비용 가변성 해결**: 단일 행 조회와 수만 행의 스캔 작업을 동일하게 취급하던 문제를 해결하기 위해, 행 수, 바이트 크기, 대기 시간(latency)을 결합한 '요청 단위(RU, Request Unit)' 개념을 도입했습니다. * **RU 계산 모델**: 읽기 비용은 $1 + w_r \times \text{읽은 바이트} + w_l \times \text{대기 시간}$과 같은 선형 모델을 통해 산출되며, 이는 하드웨어 리소스(CPU, I/O)에 가해지는 실제 부하를 더 정확하게 반영합니다. * **토큰 버킷 알고리즘**: 각 디스패처(Dispatcher)는 짧은 에포크(Epoch)마다 할당된 RU를 로컬 토큰 버킷에 채우고, 요청마다 실시간으로 계산된 비용을 차감하여 할당량 초과 시 즉각적으로 요청을 거부합니다. ### 지연 시간 비율 기반의 적응형 부하 차단 트래픽이 급격히 변하거나 특정 샤드에 병목이 발생할 때, 시스템 전체의 붕괴를 막기 위해 실시간 신호를 기반으로 한 부하 차단 메커니즘을 운용합니다. * **지연 시간 비율(Latency Ratio) 활용**: '장기 p95 지연 시간'을 '단기 p95 지연 시간'으로 나눈 비율을 시스템 스트레스 지표로 사용합니다. 이 비율이 설정값(예: 0.3) 이하로 떨어지면 시스템 부하가 급증한 것으로 판단합니다. * **임계치 기반의 단계적 대응**: 시스템 스트레스가 감지되면 낮은 우선순위의 클라이언트 그룹부터 RU 비용을 가중해 부과함으로써 자연스럽게 트래픽 백프레셔(Backpressure)를 유도합니다. * **P² 알고리즘 적용**: 고정된 메모리 내에서 대기 시간의 백분위수(Percentile)를 추정하는 P² 알고리즘을 사용하여, 별도의 샘플 저장소나 노드 간 통신 없이도 개별 디스패처가 신속하게 의사결정을 내릴 수 있습니다. ### 데이터 접근 패턴 최적화 및 안정성 확보 단순히 요청을 차단하는 것을 넘어, 데이터 접근의 불균형으로 인한 병목 현상을 해결하는 메커니즘을 포함합니다. * **핫키(Hot-key) 탐지 및 완화**: 특정 키에 대한 요청이 집중되는 패턴을 실시간으로 감지하여, 백엔드 저장소에 도달하기 전 캐싱하거나 중복 요청을 하나로 합치는(Coalescing) 방식으로 저장소 계층을 보호합니다. * **트래픽 분리 및 고립**: 특정 클라이언트의 데이터 패턴으로 인해 발생한 병목이 전체 클러스터로 전이되지 않도록 격리 수준을 높여 다중 사용자(Multi-tenant) 환경의 안정성을 강화했습니다. 멀티 테넌트 환경의 대규모 시스템을 운영한다면 단순한 횟수 기반의 제한보다는 자원 소비량을 기반으로 한 RU 모델과 시스템 상태에 반응하는 적응형 부하 차단 전략을 도입하는 것이 서비스 가용성 확보에 훨씬 유리합니다.

100배 빠르게: 넷플릭스 마에스트로의 워크플로 엔진을 어떻게 강화했는가 (새 탭에서 열림)

넷플릭스는 대규모 데이터 및 머신러닝 워크플로우를 관리하는 오케스트레이터인 'Maestro'의 엔진을 전면 개편하여 성능을 100배 이상 향상시켰습니다. 기존 수 초 단위에 달하던 실행 오버헤드를 밀리초(milliseconds) 단위로 단축함으로써, 광고나 라이브 스트리밍과 같이 저지연 및 고빈도 스케줄링이 필요한 신규 비즈니스 요구사항을 충족하게 되었습니다. 이번 업데이트를 통해 Maestro는 확장성뿐만 아니라 극도로 빠른 실행 속도까지 갖추게 되어 개발자들의 작업 효율을 획기적으로 개선했습니다. **기존 아키텍처의 한계와 병목 현상** * **3계층 구조의 복잡성:** Maestro는 API/런타임, 엔진, 내부 플로우 엔진의 3단계로 구성되었으나, 각 계층 간의 데이터 전달과 상태 동기화 과정에서 상당한 시간이 소요되었습니다. * **폴링(Polling) 방식의 지연:** 기존의 내부 플로우 엔진은 일정 간격으로 태스크를 확인하는 폴링 방식으로 동작하여, 단계별 상태 전이 시마다 초 단위의 불필요한 대기 시간이 발생했습니다. * **분산 큐 및 데이터베이스 부하:** 분산 작업 큐(Dyno-queues)와 데이터베이스 액세스 패턴에서 발생하는 오버헤드로 인해 워크플로우가 복잡해질수록 전체 실행 속도가 저하되는 문제가 있었습니다. * **경합 조건 발생:** 강력한 일관성 보장이 부족하여 특정 단계가 두 개의 워커에서 동시에 실행되는 등의 레이스 컨디션(Race condition) 문제가 간혹 발생했습니다. **100배 빠른 엔진을 위한 설계 최적화** * **이벤트 기반 리액티브 모델:** 폴링 방식을 폐기하고 이벤트 기반 아키텍처를 도입하여, 태스크 완료 즉시 다음 단계가 실행되도록 지연 시간을 최소화했습니다. * **상태 머신 직접 관리:** 워크플로우 그래프를 내부 플로우 태스크로 변환하던 중간 레이어를 제거하고, 엔진이 직접 워크플로우와 단계별 상태 머신을 제어하도록 단순화했습니다. * **데이터 액세스 최적화:** 데이터베이스 쓰기 횟수를 줄이고 효율적인 캐싱 및 분산 잠금(Distributed Locking) 메커니즘을 적용하여 성능과 안정성을 동시에 확보했습니다. * **추상화 계층 정합성:** Maestro 엔진이 상태 전이와 생명주기를 전담하게 함으로써, 하부 플로우 엔진에 대한 의존성을 없애고 엔진의 실행 효율을 극대화했습니다. **성능 향상 결과 및 활용 사례** * **실행 속도 극대화:** 워크플로우 엔진의 내부 오버헤드가 수 초에서 밀리초 단위로 줄어들며 전체적인 응답 속도가 100배 이상 개선되었습니다. * **신규 비즈니스 지원:** 1시간 미만의 짧은 주기로 실행되는 스케줄링이나 광고(Ads), 게임 등 저지연 워크플로우가 필수적인 도메인에 적용 가능해졌습니다. * **개발 생산성 제고:** 반복적인 개발 및 테스트 사이클에서 발생하는 대기 시간이 사라져 엔지니어들의 반복 작업 효율이 크게 향상되었습니다. 대규모 확장성과 초고성능을 동시에 요구하는 환경이라면, 넷플릭스에서 검증되고 오픈 소스로 공개된 최신 버전의 Maestro 도입을 적극적으로 검토해 볼 가치가 있습니다. 특히 기존 워크플로우 엔진의 지연 시간으로 인해 실시간 처리에 어려움을 겪고 있는 조직에 강력한 해결책이 될 수 있습니다.

넷플릭스에서 Write-Ahead (새 탭에서 열림)

넷플릭스는 대규모 데이터 환경에서 발생하는 데이터 손실, 시스템 엔트로피, 복제 및 재시도 메커니즘의 한계를 극복하기 위해 분산 **Write-Ahead Log(WAL)** 추상화 레이어를 구축했습니다. 이 시스템은 데이터 변경 사항을 캡처하고 강력한 내구성을 보장하며 하위 소비자에게 데이터를 안정적으로 전달하는 단일 인터페이스를 제공합니다. 결과적으로 개발자는 복잡한 데이터 정합성 문제를 직접 해결할 필요 없이 비즈니스 로직에 집중할 수 있게 되었으며, 플랫폼 전반의 탄력성과 운영 효율성이 크게 향상되었습니다. **WAL의 핵심 구조와 유연한 API** * **WriteToLog API:** 단순한 인터페이스를 통해 내부 구현을 추상화하며, 데이터 내구성을 '성공/실패/알 수 없음'의 세 가지 상태(Trilean)로 반환하여 신뢰성을 높였습니다. * **네임스페이스(Namespace):** 데이터의 저장 위치와 방식을 정의하는 논리적 격리 단위로, 설정에 따라 Kafka, SQS 등 다양한 기반 스토리지를 선택할 수 있습니다. * **페르소나 기반 아키텍처:** 네임스페이스 설정에 따라 지연 큐, 복제 도구, 인덱싱 도구 등 목적에 맞는 다양한 '페르소나'로 동작합니다. **지연 큐와 신뢰할 수 있는 재시도 메커니즘** * 네트워크 오류나 다운스트림 서비스 장애 발생 시 데이터 처리 처리량을 희생하지 않고도 실패한 메시지를 안전하게 재시도합니다. * SQS를 기본 스토리지로 활용하여 메시지 전달 시점을 조절하는 지연 기능을 구현함으로써 실시간 데이터 파이프라인의 안정성을 확보했습니다. **범용 교차 리전 복제 및 데이터 동기화** * Kafka를 활용하여 서로 다른 리전 간에 데이터를 복제하며, 기본적으로 복제를 지원하지 않는 스토리지 엔진에서도 리전 간 데이터 정합성을 유지할 수 있게 합니다. * Key-Value 저장소와 Elasticsearch 같은 서로 다른 데이터 저장소 간의 상태를 동기화하여 구체화된 뷰(Materialized Views)나 보조 인덱스를 안정적으로 구축합니다. **안정적인 데이터 삭제 및 부하 관리** * 데이터베이스에서 대량의 데이터를 삭제할 때 발생하는 메모리 부족(OOM) 문제를 해결하기 위해 WAL을 활용합니다. * 삭제 요청을 WAL에 기록한 후 처리 속도를 제어(Rate-limiting)하거나 예약된 시간에 실행함으로써 데이터베이스 노드에 가해지는 충격을 완화합니다. **시스템 설계 원칙과 격리 전략** * **수집 및 소비의 분리:** 고가용성 수집 레이어와 신뢰 중심의 소비 레이어를 분리하여 트래픽 급증이나 다운스트림 장애가 전체 시스템으로 전이되는 것을 방지합니다. * **멀티테넌시와 격리:** 공유 리소스를 사용하되 네임스페이스별로 격리된 리소스 풀을 할당하여 특정 작업이 다른 서비스의 성능에 영향을 주지 않도록 설계되었습니다. 데이터 플랫폼 차원의 통합 WAL 솔루션 도입은 각 서비스 팀이 개별적으로 구축하던 복제 및 재시도 로직의 중복을 제거하고 기술 부채를 크게 줄여줍니다. 대규모 분산 시스템을 운영하는 조직이라면 데이터의 최종 정합성과 시스템 탄력성을 확보하기 위해 이러한 추상화된 로그 계층을 검토하는 것이 권장됩니다.

Viaduct, 5년 후: (새 탭에서 열림)

에어비앤비는 자사의 데이터 중심 서비스 메시인 'Viaduct'의 5년간의 운영 성과를 공유하며, 이를 오픈소스로 공개하고 차세대 아키텍처인 'Viaduct Modern'으로의 전환을 발표했습니다. Viaduct는 중앙 집중식 스키마와 서버리스 비즈니스 로직 호스팅, 재진입(Re-entrancy) 구조를 통해 트래픽이 8배 성장하는 과정에서도 운영 효율성과 비용 선형성을 유지해 왔습니다. 이번 개편은 파편화되었던 API를 단순화하고 실행 엔진과 비즈니스 로직 사이의 추상화 경계를 강화하여, 거대해진 코드베이스의 유지보수성과 개발 생산성을 높이는 데 중점을 두었습니다. ### Viaduct의 핵심 설계 원칙 * **중앙 스키마(Central Schema):** 전사의 모든 도메인을 하나의 통합된 그래프로 연결합니다. 개발은 팀별로 분산되어 진행되지만, 사용자는 단일한 접점을 통해 모든 데이터와 기능에 접근할 수 있어 내부 요청의 75%가 Viaduct 내에서 처리됩니다. * **호스팅된 비즈니스 로직(Hosted Business Logic):** GraphQL 서버를 단순한 게이트웨이로 사용하는 대신, 비즈니스 로직을 직접 실행하는 서버리스 플랫폼으로 운영합니다. 이를 통해 개별 마이크로서비스 운영 부담을 줄이고 개발자가 로직에만 집중할 수 있는 환경을 제공합니다. * **재진입성(Re-entrancy):** Viaduct에 호스팅된 로직이 다른 로직을 호출할 때 GraphQL 프래그먼트와 쿼리를 사용하도록 설계되었습니다. 이는 대규모 코드베이스에서 직접적인 코드 의존성을 방지하고 모듈성을 유지하는 핵심 장치입니다. ### Viaduct Modern의 API 단순화 * **Tenant API의 통합:** 과거에는 기능 구현 방식이 복잡하고 파편화되어 있었으나, 이를 '노드 리졸버(Node Resolver)'와 '필드 리졸버(Field Resolver)' 두 가지 메커니즘으로 대폭 통합하여 개발자 경험을 개선했습니다. * **결정 트리 제거:** 구현 방식을 고민해야 했던 복잡한 결정 과정을 없애고, 스키마 자체의 정의에 따라 리졸버 유형이 자연스럽게 결정되도록 설계하여 학습 곡선을 낮췄습니다. ### 테넌트 모듈성과 협업 구조 * **테넌트 모듈(Tenant Module):** 스키마와 구현 코드를 팀별 소유권 단위로 묶어 관리합니다. 팀 간의 직접적인 코드 참조는 지양하고 GraphQL 인터페이스를 통해서만 소통합니다. * **선언적 데이터 의존성:** 예를 들어 '메시징 팀'이 '사용자 팀'의 타입에 새로운 필드를 추가할 때, `@Resolver` 어노테이션에 필요한 데이터 필드(예: 성, 이름)를 선언하기만 하면 됩니다. * **코드 의존성 해소:** 데이터 수요를 선언적으로 명시함으로써, 다른 팀의 내부 로직이나 데이터 소스가 무엇인지 알 필요 없이 독립적으로 기능을 확장할 수 있습니다. ### 프레임워크 계층화 및 유지보수성 * **강력한 추상화 경계:** GraphQL 실행 엔진, 테넌트 API, 애플리케이션 코드 사이의 인터페이스를 명확히 분리했습니다. 과거의 느슨했던 경계를 강화하여 서비스 로직의 중단 없이 엔진 성능을 개선하거나 라이브러리를 업데이트할 수 있는 구조를 갖췄습니다. * **운영 안정성:** 이러한 구조적 개선을 통해 개발자 수와 코드 라인 수가 급격히 증가함에도 불구하고 장애 시간을 절반으로 줄이는 성과를 거두었습니다. Viaduct는 대규모 조직에서 데이터 접근 방식을 통합하고 비즈니스 로직을 효율적으로 관리하려는 팀에게 강력한 모델을 제시합니다. 특히 마이크로서비스의 복잡도를 낮추고 싶은 조직이라면, Viaduct의 재진입 구조와 서버리스 호스팅 개념을 도입하여 개발 민첩성과 시스템 안정성을 동시에 확보하는 방향을 고려해 볼 만합니다.

Figma를 빠르게 유지하기 (새 탭에서 열림)

Figma는 실시간 협업의 신뢰성을 높이기 위해 멀티플레이어 엔진의 동기화 메커니즘과 네트워크 복구 로직을 대폭 강화했습니다. 대규모 팀이 동시에 작업하는 환경에서도 데이터 정합성을 완벽하게 유지하고, 네트워크 불안정으로 인한 작업 손실을 방지하는 것이 이번 개선의 핵심입니다. 결과적으로 사용자는 어떤 연결 상태에서도 끊김 없이 협업하며 디자인의 일관성을 유지할 수 있게 되었습니다. **중앙 집중식 동기화 엔진과 진실의 원천(Source of Truth)** * Figma는 모든 클라이언트의 편집 상태를 일치시키기 위해 서버를 '진실의 원천'으로 활용하는 권한 기반 시스템을 운용합니다. * 클라이언트에서 발생한 모든 편집 동작은 연산(Operation) 단위로 쪼개져 서버로 전송되며, 서버는 이를 선착순으로 처리하여 전역적인 연산 순서를 결정합니다. * 성능 극대화를 위해 C++로 작성된 핵심 엔진을 WebAssembly(Wasm)로 컴파일하여 브라우저에서 실행함으로써, 서버와 클라이언트가 동일한 로직으로 복잡한 레이아웃 연산을 처리하도록 설계했습니다. **네트워크 불안정성에 대응하는 복구 메커니즘** * 일시적인 네트워크 단절 시에도 사용자가 작업을 지속할 수 있도록, 클라이언트는 서버에 전달되지 않은 편집 내역을 로컬 큐(Queue)에 안전하게 보관합니다. * 재연결이 발생하면 클라이언트와 서버 간의 버전 번호를 비교하여 누락된 연산을 즉시 동기화하며, 이 과정에서 발생할 수 있는 충돌을 자동으로 해결합니다. * '동기화 중' 상태에 대한 시각적 피드백을 개선하여 사용자가 자신의 작업이 서버에 안전하게 저장되었는지 명확히 인지할 수 있도록 UX를 보완했습니다. **대규모 세션을 위한 성능 최적화** * 수백 명의 사용자가 동시에 접속한 파일에서도 지연 시간을 최소화하기 위해, 변경된 데이터만 선별적으로 전송하는 델타(Delta) 업데이트 방식을 고도화했습니다. * 문서 전체를 다시 불러오지 않고도 특정 시점의 상태로 빠르게 복구할 수 있는 스냅샷 기능을 강화하여 초기 로딩 속도와 안정성을 동시에 확보했습니다. * 브라우저의 메모리 한계를 고려하여, 실시간 동기화 과정에서 발생하는 오버헤드를 줄이고 대용량 파일에서도 안정적인 프레임워크 유지력을 제공합니다. 실시간 협업 도구에서 신뢰성은 단순한 기능을 넘어 제품의 근간을 이루는 요소입니다. Figma의 이번 업데이트는 기술적 복잡성을 사용자에게 전가하지 않으면서도, 대규모 엔터프라이즈 환경에서 발생할 수 있는 데이터 유실 위험을 획기적으로 낮추어 창의적인 작업에만 몰두할 수 있는 환경을 구축했다는 점에서 큰 의미가 있습니다.

Shortcut 편집장의 편지를 소개 (새 탭에서 열림)

Figma는 세계 최초의 실시간 협업 디자인 도구로서, 다수의 사용자가 동시에 디자인 작업을 수행할 때 발생하는 데이터 동기화 문제를 해결하기 위해 자체적인 멀티플레이어 기술 스택을 구축했습니다. 이 시스템은 중앙 집중식 서버를 진실의 원천(Source of Truth)으로 삼아 클라이언트 간의 상태를 일관되게 유지하며, 복잡한 알고리즘 대신 도메인에 특화된 단순화된 충돌 해결 로직을 통해 성능과 사용자 경험을 동시에 잡았습니다. 결과적으로 Figma는 웹 환경에서도 네이티브 수준의 성능을 제공하며 실시간 협업의 기술적 표준을 제시하고 있습니다. ### 객체 기반 데이터 모델과 동기화 방식 * Figma의 디자인 파일은 객체(Node)들의 트리 구조로 구성되며, 각 객체는 고유한 ID와 속성(Property) 집합을 가집니다. * 일반적인 텍스트 편집기에서 사용하는 OT(Operational Transformation)나 복잡한 CRDT 방식 대신, 디자인 도구의 특성에 맞춰 '속성 단위의 결과적 일관성' 모델을 채택했습니다. * 문서 전체를 동기화하는 대신 변경된 속성만 패킷으로 전송하여 네트워크 부하를 최소화하고 효율적인 실시간 통신을 구현했습니다. ### 서버 중심의 상태 관리와 낙관적 업데이트 * 중앙 서버는 동기화 허브 역할을 수행하며, 클라이언트로부터 받은 변경 사항을 정렬하고 다른 참여자들에게 전파합니다. * 클라이언트는 네트워크 지연 시간 동안에도 사용자에게 즉각적인 반응성을 제공하기 위해 '낙관적 업데이트'를 적용합니다. * 서버에서 승인된 최종 상태가 클라이언트에 도착하면, 클라이언트는 자신의 로컬 상태를 서버의 상태에 맞춰 재정렬(Rebase)하여 최종적인 일관성을 유지합니다. ### 효율적인 충돌 해결 로직 * 단순 속성 변경의 경우 '마지막에 작성한 사람이 승리(Last Writer Wins)'하는 방식을 사용하여 충돌 해결 프로세스를 단순화했습니다. * 레이어 계층 구조 관리 시 발생할 수 있는 순환 참조 문제(예: 부모 노드가 자신의 자식 노드 하위로 들어가는 경우)를 방지하기 위한 특수한 유효성 검사 로직을 서버와 클라이언트에 동일하게 구현했습니다. * 여러 사용자가 동일한 객체의 서로 다른 속성(예: 하나는 색상, 하나는 크기)을 수정할 때는 충돌 없이 자연스럽게 병합되도록 설계되었습니다. ### WebAssembly를 활용한 성능 최적화 * 브라우저 환경에서 대규모 디자인 파일을 부드럽게 처리하기 위해 핵심 편집 엔진을 C++로 작성하고, 이를 WebAssembly로 컴파일하여 실행합니다. * 이를 통해 자바스크립트의 가비지 컬렉션으로 인한 성능 저하를 피하고, 복잡한 벡터 연산과 렌더링을 네이티브 앱에 가까운 속도로 수행할 수 있습니다. * 클라이언트와 서버 간의 데이터 직렬화 및 역직렬화 과정에서도 고성능 바이너리 포맷을 사용하여 데이터 전송 효율을 극대화했습니다. Figma의 기술적 선택은 복잡한 실시간 시스템을 구축할 때 학술적인 표준 알고리즘을 맹목적으로 따르기보다, 비즈니스 도메인의 특성에 맞춰 시스템을 단순화하는 것이 얼마나 효율적인지 잘 보여줍니다. 고성능 웹 애플리케이션을 지향한다면 WebAssembly를 통한 엔진 구축과 서버 중심의 명확한 상태 관리 전략을 검토해 볼 가치가 있습니다.

데이터베이스 아키텍처 (새 탭에서 열림)

피그마(Figma)는 급격한 사용자 증가에 따른 데이터베이스 부하 문제를 해결하기 위해 단일 Postgres 인스턴스에서 분산된 Vitess(MySQL 기반) 클러스터로 전환하는 대규모 샤딩 프로젝트를 성공적으로 완수했습니다. 이 과정에서 피그마 엔지니어링 팀은 서비스 중단 없이 테라바이트급 데이터를 이전하기 위해 정교한 실시간 복제 및 검증 시스템을 구축했습니다. 결론적으로 이들은 인프라의 한계를 미리 예측하고, 애플리케이션 계층의 수정을 최소화하면서도 수평적 확장이 가능한 데이터 아키텍처를 확보하게 되었습니다. ### 수직적 확장의 한계와 샤딩의 필연성 * 초기 피그마는 단일 AWS RDS Postgres 인스턴스에 의존했으나, 트래픽이 급증하며 가장 큰 인스턴스 크기로도 쓰기 부하를 감당할 수 없는 임계점에 도달했습니다. * 수직적 확장(Vertical Scaling)과 읽기 복제본(Read Replicas) 추가만으로는 쓰기 성능 문제를 해결할 수 없음을 인지하고, 데이터를 여러 노드에 나누어 저장하는 수평적 확장(Sharding)을 결정했습니다. * 자체적인 샤딩 솔루션을 구축하는 대신, 유튜브 등에서 검증된 오픈소스 데이터베이스 클러스터링 시스템인 Vitess를 도입하여 운영 복잡성을 관리하기로 했습니다. ### Postgres에서 Vitess로의 대규모 이관 전략 * 기존 Postgres 환경에서 MySQL 기반의 Vitess로 전환하는 것은 데이터 모델과 쿼리 호환성 측면에서 큰 도전이었으며, 이를 위해 'FDB(Figma Database)'라는 중간 레이어를 구축했습니다. * **Shadow Writing(새도우 라이팅):** 모든 쓰기 작업을 기존 DB와 새 Vitess DB에 동시에 수행하여 데이터 정합성을 실시간으로 확인했습니다. * **Logical Replication(논리적 복제):** 기존 데이터를 중단 없이 옮기기 위해 CDC(Change Data Capture) 기술을 활용하여 소스 데이터베이스의 변경 사항을 실시간으로 Vitess에 반영했습니다. ### 무중단 컷오버와 정합성 검증 * 데이터 이전의 신뢰성을 확보하기 위해 'Consistency Checker'를 가동하여 기존 DB와 새 DB의 레코드를 지속적으로 비교하고 불일치를 해결했습니다. * **Query Replay:** 실제 운영 트래픽을 복제하여 대상 시스템에 미리 실행해 봄으로써 성능 병목 지점과 쿼리 호환성 문제를 사전에 파악했습니다. * 최종 전환 시에는 아주 짧은 읽기 전용(Read-only) 시간을 가진 후, 트래픽의 방향을 Vitess로 돌리는 방식을 통해 사용자 경험에 영향을 주지 않고 성공적으로 전환했습니다. ### 개발자 경험 보존을 위한 쿼리 라우팅 * 샤딩된 환경에서도 개발자들이 개별 샤드의 위치를 신경 쓰지 않고 개발할 수 있도록 투명한 쿼리 라우팅 시스템을 구현했습니다. * 크로스 샤드 조인(Cross-shard join)과 같이 분산 환경에서 성능이 저하될 수 있는 쿼리들을 모니터링하고, 필요에 따라 스키마 설계를 최적화하여 분산 시스템의 성능 이점을 극대화했습니다. * 애플리케이션 코드의 대대적인 수정 없이도 샤딩된 데이터베이스를 활용할 수 있게 함으로써 피쳐 개발 속도를 유지했습니다. 급격히 성장하는 서비스에서 데이터베이스 확장은 피할 수 없는 과제이며, 이를 위해 서비스 초기부터 데이터 간의 관계(Entity Groups)를 명확히 정의해두는 것이 추후 샤딩 난이도를 낮추는 데 결정적인 역할을 합니다. 또한, 대규모 인프라 변경 시에는 완벽한 자동화보다는 단계적인 검증과 새도우 트래픽 테스트를 통해 데이터 유실 리스크를 최소화하는 보수적인 접근 방식이 권장됩니다.

피그마 내부 이야기: 내부 웹 (새 탭에서 열림)

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

사후 분석: 202 (새 탭에서 열림)

피그마(Figma)는 브라우저 기반의 실시간 협업 환경을 구축하기 위해 단순한 문서 편집기를 넘어선 정교한 멀티플레이어 기술을 설계했습니다. 이들은 복잡한 분산 시스템 알고리즘인 CRDT 대신, 중앙 집중식 서버를 신뢰의 원천(Source of Truth)으로 삼는 커스텀 동기화 엔진을 구축하여 성능과 일관성 사이의 균형을 잡았습니다. 이를 통해 수십 명의 사용자가 동시에 같은 디자인 파일을 지연 없이 수정하면서도 모든 변경 사항이 즉각적으로 반영되는 매끄러운 사용자 경험을 제공합니다. ### 중앙 집중식 서버와 상태 관리 * 피그마는 모든 클라이언트가 중앙 서버에 연결되는 구조를 채택하여 데이터 정합성을 유지합니다. * 클라이언트는 사용자의 입력을 즉각적으로 화면에 반영(Optimistic Update)하는 동시에 서버로 변경 사항을 전송합니다. * 서버는 수신된 변경 사항을 순차적으로 처리하고 이를 다시 모든 연결된 클라이언트에 전파하여 최종적인 데이터 일관성을 보장합니다. * 이러한 방식은 복잡한 동기화 알고리즘의 오버헤드를 줄이고, 네트워크 대역폭을 효율적으로 사용하는 데 도움을 줍니다. ### 계층적 씬 그래프(Scene Graph) 동기화 * 피그마의 디자인 파일은 객체들이 부모-자식 관계를 맺는 '씬 그래프' 구조로 이루어져 있습니다. * 각 객체는 고유한 ID를 가지며, 위치·색상·크기 등의 속성(Property) 변화는 개별적인 오퍼레이션 단위로 전송됩니다. * 전체 파일을 다시 보내는 대신 변경된 속성만 증분(Incremental) 방식으로 동기화하여 실시간성을 극대화합니다. ### 충돌 해결 전략: 단순성과 효율성 * 텍스트 편집기에서 주로 사용하는 OT(Operational Transformation)나 CRDT(Conflict-free Replicated Data Type)의 복잡성을 피하기 위해, 피그마는 속성별로 '마지막 쓰기 승리(Last-writer-wins)' 원칙을 적용합니다. * 다만, 객체의 계층 구조가 변경될 때 발생할 수 있는 순환 참조(예: A가 B의 부모가 되고 동시에 B가 A의 부모가 되는 상황)를 방지하기 위해 서버에서 특수한 유효성 검사 로직을 수행합니다. * 이 방식은 메모리 사용량을 획기적으로 낮추면서도 수만 개의 객체가 포함된 대규모 프로젝트를 원활하게 처리할 수 있게 합니다. ### 고성능 인프라와 기술 스택 * 멀티플레이어 서버는 높은 동시성과 낮은 지연 시간을 구현하기 위해 Rust 언어로 작성되었습니다. * 클라이언트 측에서는 복잡한 그래픽 렌더링을 빠르게 처리하기 위해 C++로 작성된 엔진을 웹어셈블리(WebAssembly)로 컴파일하여 브라우저에서 실행합니다. * 렌더링 파이프라인은 WebGL을 사용하여 브라우저의 GPU 성능을 최대한 활용함으로써 수많은 사용자의 커서와 개체 움직임을 부드럽게 표현합니다. 실시간 협업 기능을 설계할 때 모든 상황에 완벽한 범용 알고리즘을 찾기보다, 도메인의 특성(디자인 데이터의 구조적 특징)에 맞춘 최적화된 동기화 모델을 선택하는 것이 중요합니다. 피그마의 사례는 복잡한 분산 시스템 이론을 실용적인 공학적 타협점으로 풀어내어 사용자 가치를 극대화한 모범적인 사례라 할 수 있습니다.