Skip to content

11 14 회의

Seungheon Han edited this page Nov 30, 2024 · 4 revisions

Mediasoup 방송 관리 및 로직 정리


방송 중단 (stopBroadcast)

  • 기능: 방송 종료 시 관련된 데이터 및 연결을 정리.
  • 로직:
    1. router.close() 호출로 Router를 종료.
    2. 관련 이벤트를 처리하여 연결 데이터 삭제.

구현 코드 예시

private roomTransports = new Map<string, IRoomTransportInfo>();
private producers = new Map<string, mediasoup.types.Producer[]>();
private consumers = new Map<string, mediasoup.types.Consumer[]>();

router.close();

transport.on('routerclose', (roomId) => {
    transport.close();
    // this.roomTransports 객체 삭제
    this.roomTransports.delete(roomId);
});

producer.on('transportclose', (transportId) => {
    producer.close();
    // this.producers 객체 삭제
    this.producers.delete(transportId);
});

consumer.on('transportclose', (transportId) => {
    consumer.close();
    // this.consumers 객체 삭제
    this.consumers.delete(transportId);
});

consumer.on('producerclose', () => {
    consumer.close();
    // this.consumers 객체 삭제
    this.consumers.delete(transportId);
});
  • router가 close되면 tranpos

WebSocket 연결 끊김 처리

Best 시나리오:

  • WebSocket이 자동으로 끊기면 transport가 자동으로 close().

따로 처리가 필요한 상황:

  1. 방송자가 끊겼을 때: stopBroadcast 호출.
  2. 시청자가 끊겼을 때: leaveBroadcast 호출 및 transport.close().

방송 중단 (카메라/마이크 상태 변경) 로직

  • 서버에서 직접 처리할 필요 없다
  • Producer와 Consumer의 resume 사용

Producer와 Consumer의 상태 변경

  • 클라이언트 코드
consumer.resume();
socket.emit('resumeConsumer');
  • 서버 코드
socket.on('resumeConsumer', async () => {
    // consumerId로 consumer 찾기
    await consumer.resume();
});

Producer와 Consumer의 Pause/Resume 동작 정리


클라이언트와 서버에서의 Pause/Resume 차이

  1. 클라이언트에서 Resume/Pause

    • 클라이언트에서 Producer가 resume 또는 pause 상태를 변경하면, 미디어 스트림 전송을 중지하거나 재개.
    • 서버로 이벤트를 전송해 상태 변경 요청.
  2. 서버에서 Resume/Pause

    • 서버에서 Producer가 resume 또는 pause 상태를 변경하면, 실제 미디어 스트림 전송 자체를 중지하거나 재개.
    • 리소스 절약 목적:
      • 클라이언트가 데이터를 수신하지 않는 상태에서는 스트림을 중지하여 네트워크 리소스 낭비 방지.

리소스 관리 방안

  1. 리소스 낭비를 고려할 경우

    • 클라이언트 요청에 따라 서버의 Producer와 Consumer 상태도 동기화.
    • 클라이언트가 미디어 데이터를 수신하지 않을 경우 Server Producer를 pause하여 스트림 중지.
  2. 리소스 낭비를 고려 안 할 경우

    • 서버의 Producer와 Consumer는 항상 스트림을 유지.
    • 구현이 간단하며 실시간 방송 특성을 유지.

데이터 흐름 예시

Client Producer Server Producer Room 상태 Server Consumer Client Consumer
resume resume 유지 resume resume
pause resume 유지 resume resume
resume resume 유지 resume pause
resume resume 유지 pause resume

주요 개념

  1. 클라이언트 Producer의 Resume

    • 서버에 미디어 스트림 전송을 재개하도록 요청.
  2. 서버 Producer의 Resume

    • 실제 미디어 스트림을 재개하여 데이터를 송출.

결론 및 선택 기준

  • 리소스 최적화가 필요할 경우:

    • 클라이언트와 서버 모두에서 pause/resume 상태를 적극 관리.
    • 미디어 데이터를 수신하지 않는 경우 스트림 중지로 리소스 절약.
  • 항상 스트림 유지가 필요할 경우:

    • 서버의 Producer와 Consumer 상태를 변경하지 않고 스트림을 유지.
    • 안정성과 단순한 구조 유지.

👥 팀 강점

🧑‍💻 개발 일지

📌 ALL

📌 FE

📌 BE

💥 트러블 슈팅

📌 FE

📌 BE

🤔 고민

📚 학습 정리

📌 김광현

📌 백지연

📌 전희선

📌 한승헌

🤝 회의록

🗒️ 데일리 스크럼

💬 팀 회고


👨‍👩‍👧‍👦 소개

🌱 문화

🔨 기술 스택

⚙️ 서비스 아키텍쳐

🚧 CI/CD

🌊 Flow

💭 6주를 보내면서

Clone this wiki locally