Collaborative Editing

[동시 협업 툴-2] Collaborate and Replicate data with CRDTs (youtube 강의 요약)

아직개구리 2023. 1. 14. 13:30

https://www.youtube.com/watch?v=MvwBw5p5vUU 

 

  • coordination of replicas, coordination and communication between the replicas. 
  • confirmation from authority or another developer가 필요할 수 있다. 
  • Example) Github source code: 사용자가 개입해서 뭐가 옳은 것인지 대답하는 프로세스가 필요하고, 이게 유일한 방법일 수 있다. 왜냐하면 자동적으로 모든 programming lang. conflict를 해결하는 건 어려운 문제니까. user steps in -> tell what the answer is (a manual process) 

CRDT

  • CRDT는 conflict-free replicated data type이다.
  • yjs api를 제공하는데, crdt map을 제공함. 사용하기 쉽고, 원래 자주 쓰던 것들과 비슷한 data type을 제공하지만 내부적으로 알고리즘이 존재한다.
  • collaborative editing app 을 만들기 위해서는 user step-in moment를 줄이고 오프라인에서 수정한 것을 일정 시간이 지나고 resynchronize를 하려고 할 때 conflict가 없어야함. CRDT는 consistent state를 수학적으로 보장하기 때문에, 어떤 과정을 거치더라도 마지막에는 eventual consistency를 얻을 수 있게 된다. 

코드 설명 

centralized state를 사용하는 것 같아 보이지만 manipulating 하는 데이타 타입이 CRDT라는 측면에서 코드에 차이가 있다. data structure만을 제공하는 것이 아니라 crdt 를 synchronize하는 networking code도 포함되어 있다. webrtc provider which comes with yjs lib. 와 indexdb를 사용했다. indexdb는 browser 내부에 있는 database이고, key-value type 을 제공한다. client side에서 indexdb를 사용해서 offline 작업을 지원한다. yjs provider를 사용해서 crdt database를 indexdb에 synchronize해서 offline작업이 가능하도록 한다. event handler안에서 state를 mutate할 때 crdt api를 사용한다. 

Demonstration

  • chrome, firefox 사이에서 collaborate 가능. 
  • offline support를 하기 때문에 chrome 에서 network 를 offline으로 해도 똑같이 유지된다. 
  • indexdb를 보면 여러개의 record가 있음. 하나의 레코드가 뭔지 알 필요는 없지만 single modification 과 연결되어있을 것. 
  • mashes the updates together 한다. 결과는 conflict-free, 결과적으로는 모든 사람이 same update를 가지고 마지막으로 보는 것이 같다는것을 보장한다. 
  • 또한 똑같은 object에 대해서 하나는 offline 에서 변경하고, 한 browser에서는 online 으로 변경해놓고 이후 offline-> online으로 하면 둘다 보는 화면이 똑같아진다. 

코드 분석은 다음 글에서..!  

  • SolidJS 사용 (관련해서 공부하기) & vite 사용 
  • yjs library & y-indexeddb & y-webrtc 사용 

 

Reference 

https://github.com/dairyisscary/syn 

https://github.com/yjs/yjs 

 

What to read next 

solid js 관련

https://typeofnan.dev/solid-js-feels-like-what-i-always-wanted-react-to-be/ 

https://ui.toast.com/posts/ko_20220331