Repository files navigation
유튜브 플레이리스트와 같은 플레이리스트를 효율적으로 구현해야 한다.
기본적으로 대규모 트래픽을 가정하고, 서버와 데이터베이스의 최적화를 목표로 한다.
또한 레디스가 대규모 요청을 충분히 처리할 수 있음을 가정한다.
플레이리스트를 생성할 수 있다. 생성은 대규모로 진행된다.
플레이리스트의 조회는 모든 유저가 가능하지만, 플레이리스트 업데이트는 생성한 유저만 가능하다.
플레이리스트안의 노래들을 순서를 변경할 수 있다. 여러개를 한번에 변경할 수 있다.
플레이리스트에 중복된 노래를 추가할 수 없으며, 노래는 최대 1000개까지 추가할 수 있다.
문서화 PR
플레이리스트 순서 정보 관리를 위해 Gap-based numbering 방식 도입
인덱스 업데이트 비효율을 줄이기 위해 배치 업데이트 진행 (추후 인덱스 제거 검토)
리오더링 시 메모리 비효율을 최소화하기 위해 DTO 프로젝션 도입
문서화 PR
대규모 트리팩에서는 캐시 관리가 필수적이다.
하지만 모든 플레이리스트를 캐시 관리하기엔 비효율적인다.
따라서 LFU를 통해 인기 게시글과 비인기 게시글을 관리한다.
3️⃣ 분산락을 통한 동시성 제어 및 쿼리 튜닝을 통한 성능 개선
분산락 문서화 쿼리 성능 테스트 문서화 PR
DB 트리거 방식의 단점을 보완하기 위해 분산락을 도입하여 동시성 제어
3개의 쿼리를 1개로 줄임으로 요청 처리량 32.43% 개선
문서화 PR
플레이리스트 생성시 레디스 캐시와 배치 인서트를 활용한다.
요청이 들어오면 먼저 캐시에 저장후, 사용자에게 응답한다.
이후 1000ms애 한번 배치 처리를 통한 벌크 인서트를 진행한다.
단, 대규모 트래픽시 1000ms라 하더라도 메모리 문제로 이어질 수 있으므로 특정 카운트에 도달하면 미리 벌크 인서트를 진행한다.
About
플레이리스트를 어떻게 효율적으로 구현할까
Resources
Stars
Watchers
Forks
You can’t perform that action at this time.