멀티플레이어를 더 안정적으로 (새 탭에서 열림)

피그마는 실시간 동기화의 복잡성을 해결하기 위해 기존의 일반적인 알고리즘인 OT(Operational Transformation) 대신, 중앙 집중식 서버를 활용한 독자적인 멀티플레이어 엔진을 구축했습니다. 디자인 파일의 계층 구조와 복잡한 속성을 효율적으로 관리하기 위해 서버를 유일한 진실의 원천(Single Source of Truth)으로 삼고, 속성 단위의 충돌 해결 방식을 채택했습니다. 이를 통해 피그마는 수천 명의 사용자가 동시에 협업하더라도 지연 없는 매끄러운 사용자 경험을 제공하며 웹 기반 디자인 도구의 한계를 극복했습니다.

중앙 집중식 동기화 엔진과 객체 그래프 구조

  • 피그마의 데이터 모델은 단순히 텍스트의 나열이 아니라, 수많은 객체(도형, 레이어 등)가 계층적으로 연결된 트리 형태의 그래프 구조입니다.
  • 구글 독스 등에서 사용하는 OT 방식은 텍스트 편집에는 적합하지만, 복잡한 객체 그래프의 동기화에는 지나치게 복잡하고 성능 부하가 크다는 단점이 있습니다.
  • 이를 해결하기 위해 피그마는 클라이언트 간 직접 통신이 아닌, 모든 변경 사항이 반드시 서버를 거치도록 설계했습니다. 서버는 편집 명령의 순서를 결정하고 이를 모든 클라이언트에 브로드캐스팅하여 전체 상태의 일관성을 보장합니다.

Last Write Wins(LWW) 기반의 충돌 해결

  • 피그마는 개별 객체의 속성(예: 색상, X 좌표, 불투명도) 수준에서 동기화를 수행합니다.
  • 복잡한 알고리즘 대신 '마지막에 쓰인 값이 승리(Last Write Wins)'하는 단순한 전략을 사용합니다. 두 사용자가 같은 객체의 서로 다른 속성(하나는 색상, 하나는 위치)을 수정하면 두 변경 사항이 모두 자연스럽게 반영됩니다.
  • 동일한 속성을 동시에 수정할 경우에만 서버에 먼저 도착한 요청이 우선순위를 가지며, 이를 통해 동기화 로직을 단순화하고 예측 가능한 동작을 구현했습니다.

Rust와 WebAssembly를 활용한 고성능 인프라

  • 브라우저 환경에서 데스크톱 수준의 성능을 내기 위해 피그마의 핵심 엔진은 C++로 작성되었으며, 이는 WebAssembly(Wasm)를 통해 웹 환경에서 실행됩니다.
  • 멀티플레이어 서버는 높은 동시성 처리에 최적화된 Rust 언어로 개발되었습니다. Rust는 메모리 안전성을 보장하면서도 실시간 메시지 라우팅에 필요한 저지연 성능을 제공합니다.
  • 네트워크 대역폭을 절약하기 위해 변경된 데이터만 전송하는 델타 동기화 기술과 바이너리 프로토콜을 사용하여 데이터 전송 효율을 극대화했습니다.

낙관적 업데이트와 클라이언트 상태 관리

  • 사용자 경험의 즉각성을 위해 클라이언트는 서버의 응답을 기다리지 않고 로컬에서 즉시 변경 사항을 반영하는 '낙관적 업데이트'를 수행합니다.
  • 서버로부터 확정된 순서의 데이터가 도착하면 클라이언트는 자신의 로컬 상태와 비교하여 필요한 경우 상태를 재조정(Reconciliation)합니다.
  • 이 과정에서 사용자에게 시각적 끊김을 주지 않기 위해 부드러운 보간(Interpolation) 기술이 적용되어 다른 사용자의 마우스 움직임이나 편집 과정이 실시간처럼 보이게 합니다.

피그마의 사례는 모든 실시간 협업 도구에 복잡한 OT나 CRDT 알고리즘이 필수적인 것은 아님을 보여줍니다. 서비스의 도메인 특성(디자인 객체 모델)을 정확히 파악하고, 그에 맞는 단순하고 효율적인 충돌 해결 전략과 고성능 언어(Rust/Wasm)를 결합하는 것이 대규모 실시간 시스템 구축의 핵심입니다.