Google Docs가 동시 편집을 처리하는 방식
Google Docs는 여러 사람이 동시에 하나의 문서를 편집할 수 있게 해줍니다.
두 사람이 정확히 같은 초에 같은 줄을 편집하면 어떻게 될까요?
일반적인 시스템은 데이터를 읽고, 수정하고, 저장하는 방식으로 작동합니다. 만약 두 사람이 동시에 저장하면, 두 번째 사람이 첫 번째 사람의 내용을 덮어쓰게 됩니다. 결과적으로 첫 번째 사람은 작업 내용을 잃게 됩니다.
Google Docs는 Operational Transformation (OT)를 사용하여 이 문제를 방지합니다.
글자를 입력할 때마다 문서 전체를 보내는 것이 아니라, 작은 작업(operation) 단위로 보냅니다.
예를 들어:
- 사용자 A가 6번 위치에 "Beautiful"을 삽입합니다.
- 사용자 B가 6번 위치에 "Amazing"을 삽입합니다.
만약 서버가 아무런 변경 없이 이를 적용한다면, 한쪽의 편집 내용은 사라질 것입니다.
대신, 서버는 이 작업들을 변환(transform)합니다.
서버는 사용자 A가 먼저 문서를 업데이트한 것을 확인합니다. 이에 따라 문서의 길이가 늘어납니다. 서버가 사용자 B의 작업을 처리할 때, 위치를 6에서 16으로 변경합니다.
최종 텍스트는 Hello Beautiful Amazing World가 됩니다.
두 편집 내용이 모두 유지됩니다.
이 시스템은 다음과 같은 기술적 기둥에 의존합니다:
- 지속적인 연결을 위한 WebSockets.
- 어떤 편집이 어떤 버전에서 왔는지 알기 위한 버전 추적(Version tracking).
- 변경 사항을 전파하기 위한 실시간 이벤트 스트림(Real-time event streams).
Google Docs는 문서를 잠그지(lock) 않습니다. 문서를 잠그면 한 사람이 타이핑하는 동안 다른 모든 사람의 작업이 중단되기 때문입니다.
대신, 지능적인 병합(intelligent merging) 방식을 사용합니다.
시스템은 커서 위치도 변환합니다. 누군가 당신의 앞부분에 텍스트를 추가하면, 커서가 앞으로 이동하여 작업 위치를 잃지 않도록 합니다.
Google Docs는 OT를 사용하지만, Figma와 같은 많은 최신 도구들은 Conflict-free Replicated Data Types (CRDT)를 사용합니다. CRDT는 중앙 서버 없이도 사용자들이 변경 사항을 병합할 수 있게 해줍니다.
시스템 디자인을 공부하고 있다면 다음 사항들을 기억하세요:
- 낮은 지연 시간을 위해 WebSockets를 사용하세요.
- 충돌 해결을 위해 OT 또는 CRDT를 사용하세요.
- 변경 사항을 추적하기 위해 버전 번호를 사용하세요.
- 사용자 경험을 개선하기 위해 커서를 동기화하세요.
Google Docs는 충돌을 방지하는 것이 아니라, 편집 내용을 변환하여 모든 사람이 동일한 결과를 볼 수 있도록 충돌을 해결합니다.
