This Month What I Learned 12

주영택·2021년 12월 2일
1

This Month What I Learned

목록 보기
12/24

데이터베이스 lock 를 활용한 동시 시청 제한

영상 스트리밍 서비스를 하다 보면 당연하게 요구되는게 시청 기록 관리와 동시 스트리밍 제한에 대한 것들이 있다.

시청 기록 관리에는 주로 통계용 데이터 aggregation 이지만 어느 정도의 정밀도를 가지느냐 등은 또 다른 차원의 문제가 된다.

그리고 스트리밍하는 스트림 갯수 제한은 트래픽이 비용인 서비스에서 매우 중요한 기능이 된다.

시청 기록을 직접 RDB 에 관리하지는 않지만 적당히 모아서 RDB 에 담아둔다고 가정해 보자.

  • 마지막 재생 위치: playhead, position 등이다.
  • 구간 당 시청 횟수: 영상 클립을 구간별로 나누고 이 구간에 대한 재생 횟수 정도를 기록한다.

이 기록은 RDB 에서 하나의 row 로 처리되는 경우가 많다. 구간을 각각의 record 로 관리하기에는 너무 부담되기 때문에 특정 필드를 array 타입으로 구분하여 처리하곤 한다.

이 경우 row 레벨 lock 을 지원하는 RDB 를 사용하는 방법은 어떨까 고민해 보았다.

LOCK IN SHARE MODE 이 적당해 보인다.

  1. 적당히 redis 같은 빠른 데이터베이스에 고객 단위 * 클립 단위로 데이터를 쌓는다.
  2. 데이터 갯수가 적당히 모였을 때 + 데이터 사이즈가 적당한 크기가 되었을 때 RDB 로 넣을 준비를 한다.
  3. RDB 의 특정 row 를 share mode 로 잠근다. (없다면 먼저 생성)
  4. 시청 기록을 갱신한다.
  5. 이 과정에 다른 스트림에서 시청 기록 갱신이 요청되면 예외 처리 하여 해당 스트림 재생을 중단한다.
  6. lock 을 푼다.

인터벌이 얼마나 짧으냐에 따라 실제 효율이 날 듯 하다. 적어 놓고 보니 그닥 유용하지 않구나.

앞단에 있는 메모리 기반 DB 에서 점검하는게 좋겠다...

gleam 의 툴체인 도입

gleam.run 의 0.18 릴리즈에 빌드 툴 체인이 들어왔다.

즉 rebar3 를 추가로 설치하지 않아도 된다는 것이다. erlang 이랑 gleam 만 필요하다. dart 의 pub 에 사용되는 패키지 관리 알고리즘을 rust 로 포팅하여 넣었다고 한다.

이제 좀 더 쓸만해졌다고 본다. 요즘 언어 시스템/환경은 빌드 툴 정도는 기본 탑제가 주요 덕목 같다. rust/cargo 도 그렇고 zig 도 그렇고...

erlang 에 대해서 좀 더 알아보는 시간을 가져야겠다.

링크들

profile
NodeJS 백엔드 웹 개발자입니다.

3개의 댓글

comment-user-thumbnail
2021년 12월 14일

잘 지내시나용?

2개의 답글