나는 OSSCA(오픈소스 컨트리뷰션 아카데미 https://www.contribution.ac/)의 Yorkie라는 오픈소스에 참여하고 있다. 거기서 yorkie 그리고 코드페어의 동작을 설명하는 세미나를 듣고 메모한 내용이다.
react app은 activate, attach, watch, ? 4개를 통해서 yorkie 서버와 통신한다.
- activate
코드페어에서 클라이언트 생성. 앱에서 클라이언트를 요청하면 요키 서버에서 클라 id를 준다.(지금 id가 제대로 생성이 안되어서 클라이언트가 계속 생성되는 이슈가 존재)
- attach
클라이언트가 어떤 문서를 볼지 알려주는 거
- watch
요키 서버가 문서 보기? stream 생성
- change ordering
어떻게 사용자 둘이 같은 내용을 결국 바라보게 할 수 있는 것인가? 이건 어떻게 변화를 정렬할지에 대한 이야기. 예를 들어 순서에 사용자 id까지 붙여서 정렬을 한다든지.
근데 이렇게 하면 노드를 삭제할 때 문제가 발생하므로 툼스톤이라고 해서 소프트 delete 같은 걸 한다. A는 노드1을 삭제했는데 B에서 작성 중인 문서의 내용에서는 노드2를 참조하고 있을 수 있기 때문이다.
하지만 이러다가 언젠가는 진짜로 노드를 삭제해야 하므로 gc가 동작한다. 일단은 소프트 delete -> 진짜 노드를 삭제할 수 있을 때가 오면 gc가 삭제
- snapshot
change를 하나하나 생성하면 비효율적이니까 change들을 묶어서 스냅샷을 생성하고 어느 정도 시점이 되면 새로 들어온 녀석들에게는 스냅샷 + 그가 들어온 이후의 change들만 보내준다.
- 사용자가 나갈 때
사용자가 나갈 때는, 들어올 때 attach와 activate를 했듯이 나갈 땐 detach, deactivate를 해야 한다. gc를 위해서..
이럴 때 사용자들이 보고 있는 내용이 꼬이는 걸 방지하기 위해서 좀 더 정확한 벡터 클럭을 사용 중
- 인증
코드페어가 요키에 데이터를 보내면 코드페어 서버에서 인증 + document 서버에서 인증으로 2번 인증함
헤더에 x-api-key에 퍼블릭키도 넣어서 보내는 중
그리고 yorkie 서버에서 코드페어로 보내는 웹훅 기능도 있음
근데 이런 변경사항을 코드페어로 전부 보내게 되면 코드페어는 일반적인 crud 서버이므로 부하가 너무 많이 걸린다. 따라서 일정 간격을 두고 웹훅을 보내도록 스로틀 + 디바운스(디바운싱은 최종 변경사항이 반영되도록 하기 위해서 적용)를 적용 중
- 스케일업
어떻게 더 많은 부하를 받을 수 있을까? k8s를 이용해서 분산할 수 있도록 해줌. 요키 서버에서 샤딩 한번 + 몽고디비 서버에서 한번 더 샤딩
현재는 도큐먼트 단위로 샤딩을 적용 중. 같은 문서에 있으면 같은 서버에 붙음
요청을 보낼 때 잘 보면 api 키뿐 아니라 샤드키도 보냄. 샤드키 보면 도큐먼트 키도 붙어있다. 이때 db를 쓰기에 강한 scylladb라는 걸 쓰자는 이슈도 올라와 있음