가상 면접 사례로 배우는 대규모 시스템 설계 14장을 참고한 글입니다.
매일 사용하지만 설계해 본 적 없는 기능에 대히여
1) 설계 범위 정하기
- 어떤 기능? 비디오를 올리고 시청하는 기능
- 클라이언트는? 모바일, 웹, 스마트TV
- DAU는?
- 사용자가 소비하는 시간은?
- 클라우드 인프라 활용 가능한지?
빠른 업로드, 원활한 재생, 재생 품질 선택, 낮은 인프라 비용, 가용성, 확장성, 안정성에 초점을 둔다.
2) 설계안
비디오 업로드 절차
생소한 컴포넌트만 살펴보면
- 메타데이터 데이터베이스/캐시 : 비디오의 메타데이터를 보관한다. 샤딩과 다중화를 적용하여 성능 및 가용성 요구사항을 충족한다.
- 트랜스 코딩 서버 : 비디오 트랜스코딩은 비디오 인코딩이라 부르기도 하는 절차로, 비디오의 포맷(MPEG, HLS 등)을 변환하는 절차다. 단말이나 대역폭 요구사항에 맞는 최적의 비디오 스트림을 제공하기 위해 필요하다.
- 트랜스코딩 비디오 저장소 : 트랜스 코딩이 완료된 비디오를 저장하는 BLOB 저장소이다.
- 트랜스코딩 완료 큐 : 비디오 트랜스코딩 완료 이벤트를 보관할 메시지 큐이다.
- 트랜스코딩 완료 핸들러 : 트랜스코딩 완료 큐에서 이벤트 데이터를 꺼내어 메타데이터 캐시와 데이터베이스를 갱신할 작업 서버들이다.
* BLOB : Binary Large Object, 파일 형식을 따를 필요 없는 비정형 데이터
비디오 스트리밍 절차
먼저 스트리밍 프로토콜 개념을 알아두자. 스트리밍 프로토콜은 스트리밍을 위해 데이터를 전송할 때 쓰이는 표준화된 통신방법이다.
다운로드는 비디오를 단말로 내려받는 것을 말하며, 스트리밍은 장치가 원격지에서 지속적으로 비디오 스트림을 전송 받아 영상을 재생하는 것이다. 따라서 비디오는 CDN에서 바로 스트리밍 된다.
3) 더 상세히
비디오 트랜스코딩
비디오를 녹화하면 단말과 호환되는 비트레이트와 포맷으로 저장되어야 한다. 다음은 트랜스코딩이 중요한 이유이다.
- 가공되지 않은 원본 비디오는 저장공간을 많이 차지한다.
- 상당수의 단말과 브라우저는 특정 종류의 비디오 포맷만 지원한다. 따라서 여러 포맷으로 인코딩해 두는 게 호환성에 바람직하다.
- 모든 사용자에게 끊김없는 재생을 보장하려면, 네트워크 대역폭에 따라 화질을 선택해 스트림해야 한다.
- 모바일 단말은 네트워크 상황이 수시로 달라질 수 있다. 비디오 화질을 자동으로 변경하거나 수동으로 변경할 수 있어야 한다.
이해 ㅇㅋ?
시스템 최적화
속도 최적화
- 비디오 병렬 업로드
- 하나의 비디오를 작은 GOP로 분할해 업로드한다. 일부가 업로드 실패하더라도 빠르게 재개할 수 있다.
- 업로드 센터를 사용자 근거리에 지정
- 모든 절차를 병렬화
- 느슨하게 결합된 시스템을 만들어서 병렬성을 높이는 것이다.
- 이전 단계의 결과물이 다음 단계의 입력으로 사용하면 결합도가 높아진다. (의존성이 높아짐)
- 결합도를 낮추기 위해 메시지 큐를 도입한다.
- 메시지 큐 도입하기 전에는 인코딩 모듈은 다운로드 모듈의 작업이 끝나기까지 기다려야 했다.
- 메시지 큐를 도입 후 인코딩 모듈은 큐에 보관된 이벤트 각각을 병렬 처리할 수 있다.
안정성 최적화
- 미리 사인된 업로드 URL
- 허가 받은 사용자만이 올바른 장소에 비디오를 업로드 할 수 있게 pre-signed URL을 이용한다. ('미리 사인된'은 사실 아마존S3에서 사용하는 용어다. 접근 권한이 이미 주어진 상태를 의미한다.)
- 비디오 보호
- 디지털 저작권 관리(DRM) 시스템 도입, AES 암호화, 워터마크 등
비용 최적화
CDN이 핵심 부분이다. 하지만 비싸다. CDN을 사용하는 이유를 생각하면 비용을 줄일 수 있다.
- 인기 있는 비디오를 저장한다.
- 인기가 없으면 인코딩 할 필요가 없을 수 있다. 짧은 비디오라면 필요할 때 인코딩 해도 된다.
- 특정 지역에서 인기가 높으면 그 지역 CDN에 저장한다.
- CDN을 직접 구축하고 ISP와 제휴한다. (는 초대형 프로젝트긴 하다)
- 이 외에도 이용패턴, 비디오 크기 등 데이터에 근거한다.
4) 더 생각해 볼 것
- 라이브 스트리밍(트위치, 치지직...) : 시스템간 비슷한 점이 많다. 라이브 스트리밍의 경우 latency가 더 낮아야 한다. 스트리밍 프로토콜 선정에 유의하자. 병렬화 필요성은 덜 중요하다. 작은 단위의 데이터를 실시간으로 빨리 처리해야 하기 때문이다.
- 비디오 삭제 : 저작권을 위반한 비디오, 선정적 비디오, 불법적 비디오 때로는 사용자 신고가 누적된 비디오 등을 식별하는 과정
'Develop > etc' 카테고리의 다른 글
개략적인 검색어 자동완성 시스템에 대한 이야기 (0) | 2024.04.26 |
---|---|
개략적인 채팅 시스템에 관한 이야기 (0) | 2024.04.25 |
개략적인 뉴스 피드 시스템 설계에 관한 이야기 (0) | 2024.04.24 |
Adapter Pattern은 무엇인가 (0) | 2023.09.13 |
Nginx 넌 도대체 뭐니 (0) | 2023.09.12 |