2025-08-09 Open Up Yorkie 세미나

나는 OSSCA(오픈소스 컨트리뷰션 아카데미 https://www.contribution.ac/)의 Yorkie라는 오픈소스에 참여하고 있다. 거기서 yorkie 그리고 코드페어의 동작을 설명하는 세미나를 듣고 메모한 내용이다.

react app은 activate, attach, watch, ? 4개를 통해서 yorkie 서버와 통신한다.

  1. activate

코드페어에서 클라이언트 생성. 앱에서 클라이언트를 요청하면 요키 서버에서 클라 id를 준다.(지금 id가 제대로 생성이 안되어서 클라이언트가 계속 생성되는 이슈가 존재)

  1. attach

클라이언트가 어떤 문서를 볼지 알려주는 거

  1. watch

요키 서버가 문서 보기? stream 생성

어떻게 사용자 둘이 같은 내용을 결국 바라보게 할 수 있는 것인가? 이건 어떻게 변화를 정렬할지에 대한 이야기. 예를 들어 순서에 사용자 id까지 붙여서 정렬을 한다든지.

근데 이렇게 하면 노드를 삭제할 때 문제가 발생하므로 툼스톤이라고 해서 소프트 delete 같은 걸 한다. A는 노드1을 삭제했는데 B에서 작성 중인 문서의 내용에서는 노드2를 참조하고 있을 수 있기 때문이다.

하지만 이러다가 언젠가는 진짜로 노드를 삭제해야 하므로 gc가 동작한다. 일단은 소프트 delete -> 진짜 노드를 삭제할 수 있을 때가 오면 gc가 삭제

change를 하나하나 생성하면 비효율적이니까 change들을 묶어서 스냅샷을 생성하고 어느 정도 시점이 되면 새로 들어온 녀석들에게는 스냅샷 + 그가 들어온 이후의 change들만 보내준다.

사용자가 나갈 때는, 들어올 때 attach와 activate를 했듯이 나갈 땐 detach, deactivate를 해야 한다. gc를 위해서..
이럴 때 사용자들이 보고 있는 내용이 꼬이는 걸 방지하기 위해서 좀 더 정확한 벡터 클럭을 사용 중

코드페어가 요키에 데이터를 보내면 코드페어 서버에서 인증 + document 서버에서 인증으로 2번 인증함
헤더에 x-api-key에 퍼블릭키도 넣어서 보내는 중

그리고 yorkie 서버에서 코드페어로 보내는 웹훅 기능도 있음

근데 이런 변경사항을 코드페어로 전부 보내게 되면 코드페어는 일반적인 crud 서버이므로 부하가 너무 많이 걸린다. 따라서 일정 간격을 두고 웹훅을 보내도록 스로틀 + 디바운스(디바운싱은 최종 변경사항이 반영되도록 하기 위해서 적용)를 적용 중

어떻게 더 많은 부하를 받을 수 있을까? k8s를 이용해서 분산할 수 있도록 해줌. 요키 서버에서 샤딩 한번 + 몽고디비 서버에서 한번 더 샤딩

현재는 도큐먼트 단위로 샤딩을 적용 중. 같은 문서에 있으면 같은 서버에 붙음

요청을 보낼 때 잘 보면 api 키뿐 아니라 샤드키도 보냄. 샤드키 보면 도큐먼트 키도 붙어있다. 이때 db를 쓰기에 강한 scylladb라는 걸 쓰자는 이슈도 올라와 있음