현재 각 사용자의 미디어 재생은 uuid
로 구분되어 data_play
테이블에 축적되고 있다. 이 형태를 그대로 NoSQL인 DynamoDB에 입력하면 집계 함수를 사용할 수 없기 때문에 다른 구성방식 고려해야 사용이 가능하다.
위 글에서는 게임 애플리케이션에서 실시간으로 출력되는 리더보드를 DynamoDB를 이용해 구현한 사례를 다루고 있다.
1초에 약 80,000개 이상의 DB write 작업을 하는 게임 애플리케이션의 개발자는 이러한 ‘heavy-write’ 앱에 DynamoDB를 사용하기로 결정했다. 이러한 작업에서의 성능은 db가 얼마나 유연한지에 달려있다.
’Rockset’은 AWS의 파트너 기업이다. Rockset은 클라우에 DB에 있는 데이터가 실시간으로 분석에 이용될 수 있도록 하는 서비스이다. Rockset을 사용하면 DynamoDB에 있는 데이터들도 집계와 JOIN이 가능하다.
DynamoDB에는 스트림 기능이 있다. 스트림은 DynamoDB 테이블의 변경을 추적을 가능하게 해주는 기능이다. 테이블마다 지정할 수 있으며 스트림 기능을 활성화 한 테이블은 모든 변경 사항(PUT, UPDATE, DELETE)를 24시간 언제든지 strema record로 실시간 스트리밍으로 받을 수 있다.
여러 개의 스트림 레코드는 빠르고 효율적인 처리를 위해 샤드에 그룹으로 만들어져 하나의 단위로 변환된다. 테이블 변경 내역들은 하나의 고유키가 부여되어 샤드안에 저장된다. 이를 통해 항목 변화를 정확히 추적할 수 있고 쉽게 처리가 가능하다. 프로그래밍 코드를 사용해 샤드에서 레코드를 추출한 후 변환 받은 다음 필요한 기능을 수행할 수 있다.
스트림을 생성할 때 보기 형식을 정할 수 있다. 보기형식의 종류는 4가지가 있다.
생성된 스트림에 트리거를 추가해 Lambda를 호출할 수 있다. 이는 예전에 관계형 DB의 DB 트리거와 같은 역할을 하고있다. 관계형 DB 트리거는 DB 엔진 내에서 구현되었기 때문에 DB엔진에서 정의된 동작만 수행 할 수 있다는 한계가 있었다. 하지만 스트림과 람다를 사용한다면 테이블에 항목 변경이 일어날 때마다 관련되는 동작을 원하는 대로 구현할 수 있다. (AWS Kinesis와 유사하게 동작하는 기능이라고 한다)