CS Insights

CRDT(Conflict-Free Replicated Data Type)의 벡터 클럭 병합 알고리즘: 협업 편집 환경의 무충돌 동기화

CRDT(Conflict-Free Replicated Data Type)의 벡터 클럭 병합 알고리즘: 협업 편집 환경의 무충돌 동기화
구글 독스(Google Docs)나 실시간 화이트보드 캔버스 등, 수십 명의 사용자가 동시에 같은 문서를 타이핑할 때 글자가 꼬이지 않고 완벽하게 동기화되는 마법을 직접 구현해보기란 정말 골치 아픈 수학과의 전면승부와도 같았습니다. 초기에는 중앙 서버를 두고 변경 이벤트를 순서대로 변환해 각기 반영하는 OT(Operational Transformation) 알고리즘을 시도했으나, 이는 그로테스크한 맵핑 테이블 오류로 인해 점차 관리가 붕괴되었습니다. 수학적으로 충돌 자체가 원천적으로 일어나지 않게 만들 수는 없을까에 대한 갈증이 저희를 CRDT(Conflict-Free Replicated Data Type)의 세계로 이끌었습니다. CRDT 데이터 타입 구조에서는 교환 법칙과 가합성이 성립하도록 개별 원소(문자나 객체 다이어그램 노드)들에 완전히 전역적인, 그리고 소수점 단위의 무한한 프렉션 벡터 식별자(Fractional Indexing)를 부여합니다. 글자 'A'와 'C' 사이에 누군가 'B'를 삽입하면 'B'는 A와 C의 중간 주소값인 1.5를 획득하여 무조건 그 자리에 고정됩니다. 누군가 오프라인 환경에 떨어져 수십 번의 변경을 가미하고 3일 뒤 다시 와이파이를 연결하더라도, 전송된 이 변경 이벤트 메시지 패킷의 도착 순서와는 완벽히 무관하게 단 한의 분쟁 없이 로컬 문서의 텍스트 결과는 수학적으로 동일한 최종 일관성 트리에 안착합니다. 이렇게 결함 허용성이 높은 CRDT 엔진을 탑재함으로써 오직 로컬 환경 반응성만을 의존하게 되는 Local-First(오프라인 우선) 어플리케이션의 구현을 실현할 수 있었습니다. Yjs, Automerge 와 같은 라이브러리들이 이런 머신 메커니즘을 내장하고 있으며, 이것은 서버라는 강력한 통제관 없이도 유저들의 파편화된 조각들이 혼돈 속에서 우주적 질서를 찾아 결합하는 아름다운 동시성 수학의 결정체였습니다. 이는 상태라는 개념이 더 이상 공간의 스냅샷이 아니라 시간상에 존재하는 이벤트 합산임을 개발자에게 깨우쳐주는 인지적 혁명입니다.

Related Posts