data-persistence

2 개의 포스트

LiveGraph: Figma의 실시간 (새 탭에서 열림)

피그마(Figma)는 사용자가 디자인 작업 중 데이터를 잃지 않도록 수동 저장 방식에서 벗어나 정교한 자동 저장(Autosave) 시스템을 구축했습니다. 이 시스템은 실시간 협업 환경에서 발생하는 방대한 변경 사항을 성능 저하 없이 안정적으로 기록하기 위해 동기화 엔진(Sync Engine)과 타임라인 기반의 데이터 모델을 결합했습니다. 결과적으로 피그마는 사용자에게 '저장'이라는 행위를 인식하지 못하게 하면서도, 모든 수정 이력을 완벽하게 복구할 수 있는 신뢰성을 제공합니다. ### 동기화 엔진과 변경 사항의 추적 * 피그마의 자동 저장은 단순히 주기적으로 파일을 덮어쓰는 방식이 아니라, 모든 수정 사항을 '뮤테이션(Mutation)' 단위로 기록하는 동기화 엔진을 기반으로 합니다. * 사용자가 레이어를 이동하거나 색상을 변경할 때마다 해당 작업은 즉시 큐에 쌓이며, 엔진은 이를 서버로 전송하여 실시간으로 반영합니다. * 문서 전체를 저장하는 대신 변경된 부분(Delta)만 전송함으로써 대용량 파일에서도 네트워크 부하를 최소화하고 응답성을 유지합니다. ### 스냅샷과 타임라인 모델을 통한 이력 관리 * 무한한 변경 이력을 효율적으로 관리하기 위해 특정 시점의 전체 상태를 저장하는 '스냅샷'과 세부 변경 사항인 '오퍼레이션'을 병행하여 사용합니다. * 사용자가 과거 버전으로 되돌아갈 때 모든 변경 사항을 처음부터 다시 실행하는 대신, 가장 가까운 스냅샷을 불러온 뒤 이후의 변경 사항만 적용하는 방식을 취합니다. * 이는 복구 속도를 획기적으로 높이는 동시에 저장 공간의 효율성을 극대화하는 핵심 아키텍처입니다. ### 오프라인 작업 처리와 데이터 무결성 보장 * 네트워크 연결이 끊긴 상태에서 발생한 작업은 브라우저의 IndexedDB와 같은 로컬 스토리지에 임시로 저장됩니다. * 연결이 복구되면 클라이언트는 서버와 통신하여 로컬에 저장된 변경 사항을 순차적으로 전송하며, 이때 발생할 수 있는 충돌은 서버의 타임스탬프를 기준으로 정교하게 해결됩니다. * 서버는 최종적인 '진실의 원천(Source of Truth)' 역할을 수행하며, 모든 클라이언트가 일관된 문서를 볼 수 있도록 보장합니다. ### 성능 최적화와 사용자 경험의 조화 * 자동 저장 프로세스가 메인 렌더링 스레드를 방해하지 않도록 비동기적으로 처리하여 디자이너가 작업 중 끊김(Lag)을 느끼지 않게 설계했습니다. * 저장되지 않은 변경 사항이 있을 때는 UI를 통해 상태를 알리고, 브라우저 종료 시 경고를 띄우는 등 기술적 장치와 UX 요소를 결합하여 데이터 손실 가능성을 차단합니다. 결국 훌륭한 자동 저장 시스템은 사용자에게 그 존재가 드러나지 않을 때 가장 가치 있게 작용합니다. 기술적 복잡성을 엔진 내부로 캡슐화하고 사용자에게는 '언제나 안전하다'는 신뢰를 주는 것이 피그마 엔지니어링의 핵심 목표이며, 이는 대규모 협업 툴이 지향해야 할 실무적인 표준을 제시합니다.

실패는 피할 수 없습니다: (새 탭에서 열림)

2023년 3월, 데이터독(Datadog)은 인프라의 약 50~60%가 중단되는 대규모 장애를 겪으며 시스템의 일부가 마비될 때 플랫폼 전체가 완전히 다운된 것처럼 보이는 '정방형 파형(Square-wave)' 장애 패턴을 확인했습니다. 이를 계기로 데이터독은 모든 장애 상황을 완벽히 방지하는 것은 불가능하다는 점을 인정하고, 장애 발생 시에도 시스템이 점진적으로 기능을 유지하는 '우아한 성능 저하(Graceful Degradation)'를 최우선 가치로 삼게 되었습니다. 데이터 유실 방지, 실시간 데이터 우선 처리, 부분적인 결과 제공을 핵심 원칙으로 설정하여 인프라 전반의 회복 탄력성을 재설계하는 대대적인 변화를 추진하고 있습니다. **"결함 없음" 설계의 한계와 Square-wave 장애** - 과거 데이터독은 데이터의 '정확성'을 보장하기 위해 100% 완벽한 데이터가 수집될 때까지 쿼리 결과를 반환하지 않도록 시스템을 최적화했습니다. - 이러한 설계는 일부 노드가 다운되었을 때 시스템 전체가 응답을 멈추게 하여, 사용자에게는 플랫폼이 완전히 중단된 것처럼 보이는 이진적(Binary) 장애를 초래했습니다. - 고전적인 근본 원인 분석(RCA)을 통해 특정 트리거를 제거할 수는 있지만, 소프트웨어 업데이트, 인증서 만료 등 무한한 장애 원인을 모두 예방하는 것은 불가능하다는 결론에 도달했습니다. **우아한 성능 저하를 위한 새로운 우선순위** - 시스템 구성 요소가 완벽하게 작동해야만 가치를 제공하는 '결함 방지(Never-fail)' 아키텍처에서 '더 잘 실패(Fail better)'하는 구조로 전환했습니다. - 데이터 유실 방지: 처리가 늦어지더라도 고객의 데이터가 영구적으로 사라지지 않도록 보장합니다. - 실시간성 우선: 가용 자원이 부족할 때 오래된 데이터보다 실시간 데이터를 우선적으로 처리하여 현재 상태를 파악할 수 있게 합니다. - 부분 결과 제공: 모든 데이터가 준비되지 않았더라도 정확도가 확인된 범위 내에서 부분적인 데이터를 즉시 시각화합니다. **데이터 유실 방지를 위한 영구적 수집 저장소(Persistent Intake Storage)** - 장애 당시 메모리나 로컬 디스크에만 머물던 미복제 데이터가 노드 유실과 함께 사라졌던 문제를 해결하기 위해 파이프라인 초기 단계에 디스크 기반 영구 저장소를 도입했습니다. - 수집(Intake) 직후 데이터를 복제된 저장소에 즉시 기록함으로써, 후속 처리 시스템이 정체되거나 노드가 유실되더라도 데이터 손실 없이 재처리가 가능하도록 설계했습니다. - 이를 통해 네트워크 지연이나 하위 시스템의 과부하 상황에서도 데이터 수집 단계에서의 안정성을 확보했습니다. 모든 장애를 차단하려는 시도보다는, 장애 상황에서도 시스템이 어떻게 부분적으로나마 작동할 수 있을지를 설계 단계부터 고민해야 합니다. 대규모 분산 시스템을 운영한다면 데이터의 완전성(Completeness)과 가용성(Availability) 사이의 균형을 재검토하고, 최악의 순간에도 사용자에게 최소한의 가시성을 제공할 수 있는 복구 탄력성을 구축하는 것이 권장됩니다.