다들 많이 써봤을 Google Docs, Notion 등에서 동시에 같은 문서를 편집할 수 있는 것을 체험해보셨을겁니다. 굉장히 유용하고 직관적인 방법이지만 이것을 어떻게 구현하였을까요?
똑같은 위치를 동시에 수정하면 겹쳐서 다른 결과가 나와야할텐데 이를 어떻게 잘 조정하는지 두 가지 방법을 알아보겠습니다.
글자 변경이라는 operation을 시간 순서에 따라 쭉 기록해 server로 전송합니다.
그 이후 서버에서 순차적으로 변경을 실행해 이전 동작에 의해 바뀐 글자의 인덱스를 수정해 알맞게 transform 시켜줍니다. 그리고 이것을 클라이언트에 반환해 동시 편집을 구현합니다.
tranform 시켜줄 server가 필수 -> 무거워진다transform을 위한 연산 시간이 필요해서 반응이 느리다OT와는 다르게 순서와는 상관 없이 변경사항만 같으면 같은 결과가 나옵니다.
OT는 인덱스 기반이지만, CRDT는 각 문자에 고유한 id를 부여하므로 특별한 연산 없이 merge 하면 되므로, 서버 없이 편집자들끼리 데이터를 주고받으면 됩니다.
interleaving: 고유 id가 랜덤하게 부여 된다면 글자가 이상하게 merge 됨 -> 개선 알고리즘 존재(RGA, Treedoc, WOOT)https://jakelazaroff.com/words/an-interactive-intro-to-crdts/