현재 저희 프로젝트는 mediasoup 을 통해 스트리밍 환경을 구성하고 있습니다.

최대한 많은 유저가 들어와 화상 서비스를 이용하는 것을 목적으로 하는 만큼 소켓 이벤트, 기존 할당된 자원에 대한 관리를 진행하며 최대한 적은 자원으로 나은 환경을 제공하기 위해 최적화를 진행하였습니다.

1. 소켓 이벤트 최적화

이전 접속중인 사용자당 연결된 프로듀서의 개수만큼 이벤트가 발생하였습니다.

스크린샷 2024-11-29 오전 1.44.32.png

단순 계산을 진행했을 때 300명 접속 시 약 45,000개((n * (n-1) / 2))의 이벤트 발생하기 때문에 서버와 클라이언트 모두에 부하가 걸리는 상황이었습니다.

이를 해결하기 위해 단일 이벤트 한번에 모든 유저 스트림 정보를 전송하여 이를 해결하고자 하였습니다.

mediasoup에 경우 내부적으로 c++로 구현되어 있기 때문에 docker 이미지 빌드시 mediasoup에 대한 컴파일링을 진행해야합니다.

다음을 수행하며 github action에서 CD를 수행할 때 10분정도 걸리는데 docker image에 대한 캐시나 pnpm-lock.json 변경에 따라 github actions의 캐시를 업데이트하는 방향을 생각하고 있습니다

개선 방안

*// Before*
producers.forEach(producer => {
	consume(producer);
});

*// After*
socket.emit(
  SOCKET_EVENTS.createConsumers,
  params,
  async (result: client.CreateConsumerRes[]) => {
    if (!result || !result.length) return;

    const remoteStreams = await Promise.all(result.map(createRemoteStream));

    resolve(remoteStreams);
  }
);

스크린샷 2024-11-29 오전 1.46.59.png

2. 선택적 스트림 수신