Q.
현재 공동 편집이 가능한 문서를 만들고 있습니다!
사용자들이 에디터에서 입력한 내용을 DB 에 저장하는 방식에 대해서 질문이 생겼습니다.
처음에는 저장 버튼을 만들지 않고, 문서 내용을 자동 저장하는 방식으로 구현하려고 했습니다.
자동 저장은 유저가 페이지에서 나갈 때 동작하는데, 이 경우 중간에 서버가 꺼지면 쓰던 글 내용이 다 날아가는 문제가 있을 것 같아서
1) 자동 저장
+
2) 일정 시간마다 글 전체 내용을 복사하여 서버에서 지속적으로 저장 ( 스냅샷 )
하는 방식을 생각했습니다.
근데 이렇게 일정 시간마다 문서 전체를 스냅샷을 찍어서 저장하는 방식이 패킷 용량이 커서 처리하는데 성능 상에 문제가 있을 것 같다는 의견이 있었습니다. ( 서버에 부하가 있을 것 같습니다. )
혹은 소켓 서버에서 입력 / 삭제 이벤트를 받을 때마다 서버 인메모리 (혹은 레디스) 에 매번 반영하여 저장하고, 인메모리에 저장된 데이터를 스냅샷으로 하여 최종적으로 DB 에 저장하는 방식도 생각했습니다. ( 입력/삭제 이벤트를 인메모리에 반영할 때엔 O(n)정도 드는 작업을 추가로 거쳐야 합니다. )
하지만 이런 방식도 이벤트 처리 + 주기적으로 DB 에 저장한다는 점에서 결국 서버에 부하가 되는 것은 마찬가지일 것 같습니다.
한편, 위의 방식을 사용하지 않으면 소켓 방식을 버리고 WebRTC를 사용해서 서버 리소스를 더 줄이는 방식도 고려 중입니다.
사실 둘 다 안해본 방법이고 관련 경험이 없는 상황에서 아이디어 정도로 나온 것이라 팀원끼리도 많이 의견이 헷갈리는 상황인데, 준일님은 이런 경우 혹시 어떤 방법이 더 좋아보이시나요?
debounce → 사용자 입력이 일정 시간동안 발생하지 않았을 때 (3초, 5초) 저장한다 → DB 부하가 심하진 않을 것 같다
클라이언트에서 저장요청 vs 서버에서 저장 요청
→ 소켓 수신/송신이 3초 ~ 5초간 발생하지 않았고,
→ 마지막으로 저장된 내용에서 달라진 경우에만 저장하기
( 자동저장 자체를 http 통신으로 )