캠 스터디 서비스에서 공부방 기능을 위한 SFU 방식의 미디어 서버입니다. WebRTC 라이브러리인 mediasoup을 이용하여 개발했습니다. P2P로 구현하지 않고 미디어 서버를 둔 이유는 클라이언트의 부하를 줄이기 위함입니다. P2P인 Mesh 구조의 경우 클라이언트가 3명 이상이 되면 클라이언트의 부하가 심해집니다. 따라서 미디어 서버를 구축하였습니다.
미디어 서버는 주로 공부방 단위로 비디오, 오디오 중계를 합니다. 또한 특정 피어가 캠을 끄면 다른 피어들에게 알리고 생산자를 정지하는 등의 작업을 수행합니다. 추가적인 기능으로는 채팅, 강퇴, 차단, 방 비밀번호 설정, 뽀모도로 타이머가 있습니다. 뽀모도로 타이머의 경우 집중 시간, 휴식 시간을 번갈아가며 계속 실행됩니다.
부하테스트 결과 AWS t3 micro 성능일 때 피어 20명까지 안정적인 운영이 가능했습니다. 32명인 경우 부하율 100%가 되어 서버가 응답하지 않았습니다. 따라서 더 많은 피어를 수용할 수 있도록 방법을 찾아야 했습니다. 이는 여러 개의 미디어 서버 인스턴스를 두고, 미디어 라우팅 서버로 병렬 처리하여 문제를 해결했습니다.
추후에 인스턴스 추가 과정을 자동화하는 것이 목표입니다.
main
리모트 브런치에 커밋 후 GitHub Actions 작동- 빌드 테스트
- 도커 이미지 빌드 후 도커 허브에 푸시
- AWS Codedeploy를 이용하여 특정 네임으로 그룹핑된 미디어 서버 인스턴스들에게 배포 코드 트리거
- 배포 코드에서 미디어 서버들에게 도커 컨테이너 실행
CamstudyMediaServerTemplate
으로 인스턴스 생성- 생성된 인스턴스에 도커 설치 및 도커 허브 로그인
- CodeDeploy agent 설치 및 실행
- CodeDeploy에서 가장 최근의 media server 배포를 재배포