코로나 이후로 실시간 협업 애플이케이션이 많은 흥미를 끌었다.
Figma, Notion Google Docs 등 많은 기업들이 실시간 협업 애플리케이션 등을 내고 VS Code 또한 동시 코딩 플러그인(느리긴함)이 존재한다.
그래서 제안된 기술들이 있는데 크게 두가지이다. CRDT(Conflict-Free-Replicated Data Types), OT(Operational Transformation)이다.
실시간으로 협업 한다고 생각해보자.
OT의 방식은 아래와 같다.
HeLo 사이에 L을 추가하고 , 다른 사람은 마지막에 !를 추가한다고 생각해보자.
추가 했을 때 각자가 보고 있는 인덱스 위체에 따라 추가가 될 것이다.
1번째 사람은 3번째 Inex의 "L"을 삽입했고, 2번째 사람은 4번째 Index의 "1"를 삽입했다.
그렇다면 이제 수정한 오퍼레이션을 서버로 보내게된다. 그리고 서버가 그것을 통합한다.
만약 1번째 사람의 명령을 먼저 따른다면 "L"을 3번째 Index의 삽입한다. 하지만 그 뒤 원래 2번째 사람이 !을 4번째 Index에 넣을려고 했다. 위치가 요상하게 바뀌어 버린것이다.
그래서 Index 위치를 바꾸어 !를 4가 아닌 5에 넣게 된다.
이렇듯 Operation이 이전 동작에 따라 바뀌어 tarnsform(변환) 시켜주는 것을 OT라고 한다.
변경 사항 기록 -> 서버 전송 -> 순차적 실행 -> Client
그렇다면 현재는 왜 OT를 쓰지 않을까 대부분의 OT는 2006년부터 사용하지 않는다.
이유는 간단하다 서버 부하가 심하다는 것. 1:1이면 상관이 없겠지만 엄청나게 많은 인원이 모이고 텍스트를 수정한다면 과부하가 올 수 있다. 그래서 CRDT가 등장한다. CRDT는 중앙서버를 필요하지 않기 때문이다.
CRDT(Conflict-Free-Replicated Date Types)
CRDT는 변경사항을 받으면, 순서와 상관없이 변경사항만 같으면 같은 상태이다.
CRDT는 객체를 유니크 한 값으로 본다.
ex) 유니크 값 : 0~1 사이의 수
동일하게 L과 !를 넣으면 0.6 ~ 0.8 사에 0.7에 L을 생성하고
!는 0.8과 1사이에 0.9를 생성한다.
동시 편집을 하더라고 머지과정에서 유니크한 값으로 판별하기 때문에 충돌이 일어나지 않는다!
-> 이 말은 서버응답을 기다릴 필요 없이 진행이 가능하다는 말이다. (서버에서 데이터를 모아 순차적으로 합치지 않기 때문에)
여기서 서버가 필요 없다면 P2P(Peer to Peer)로 동작할수 있다!
하지만 어느 기술이든 문제가 없지는 않다.
위와 같이 문자를 편집한다고 해보자
만약 유니크한 값을 랜덤하게 돌린다면 글자가 이상하게 합쳐지는 모습을 볼 수 있다. 그래서 이러한 문제를 해결하기 위해 많은 알고리즘이 등장하고 있고 등장했다.
찾아본 결과 해결 알고리즘으로 Logout, RGA, TreedDoc, WOOT가 논문에서도 많은 비교대상으로 삼는 것 같다.
국내에서는 Yorkie가 가장 CRDT를 크게 알리고 있는거 같아 보인다.
사실 관심 가지게 된 계기도 오픈소스 컨트리뷰션에 떠있는 Yorkie였고 네이버 인턴십에도 CRDT가 있어서 찾아봤다.
몇개의 논문을 본결과 RGA가 공부했던 블록체인이랑 비슷하다는 생각이 들었다. 생각해보면 당연한게 두개 모두 분산 컴퓨팅 시스템이란 면에서 비슷할 수 밖에? 없다고 생각이 들었다. 분산 컴퓨팅도 접근하기 어려운게 아닌 동일한 구조에서 시작해 트리처럼 뻗어 나가고 있는 것이 아닐까하는 느낌을 받았다.