Skip to content

SFU Room Metadata 기반 실시간 뽀모도로 타이머 동기화 기능 구현 #34

Description

@Neibce

문제/이슈

  • 회의실 내 뽀모도로 타이머 구현이 필요.
  • 집중시간 + 휴식시간 = 1시간 내에서 참여자가 시간 조절 가능 및 반복 횟수(최대 12) 설정 가능.
  • 화상회의 참여자들 간에 개별 로컬 타이머를 사용할 경우, 네트워크 지연 및 클라이언트 기기 시간 차이로 인해 타이머 동기화 문제가 발생함.
  • 참여자가 타이머를 시작/일시정지했을 때, 모든 참여자에게 즉각적이고 동일한 상태가 공유되어야 함.
  • 중간에 입장 or 새로고침한 참여자도 현재 진행 중인 타이머가 문제없이 동기화되어야 함.
  • 회의 참여자 간 TZ 가 다르거나 참여자의 시스템 시간이 잘못되었을 경우라도 문제 없이 작동해야함.
  • 서버 재시작 시에도 사용자의 타이머가 휘발되어선 안됨. (Map 등 사용 불가)
  • + 휴식시간이 아닐 경우 마이크 사용 제한

해결책 제시

  • domain/pomodoro/application/PomodoroService 구현.
  • 서버 시간을 기준으로 EndTime을 계산하고, 이를 LiveKit의 Room Metadata에 업데이트하여 모든 참여자에게 브로드캐스트.
  • 클라이언트가 서버와의 시간 차이를 계산할 수 있도록 서버 현재 시간 반환 API 제공.
  • Map, Structured Concurrency, 단순 Scheduling은 성능, 정확성 및 휘발 조건 만족하지 못함.
  • Redis + ZSET + Hash 및 1-3초마다 Polling 통해 구현을 통한 구현.
    • ZSET: 종료 시간을 Score로 저장하여 스케줄링 관리 (pomodoro:scheduler)
    • Hash: 방의 현재 상태(교시, 모드) 저장 (pomodoro:state:{roomId})
    • 클라이언트 측에는 타이머 종료시간 자체가 전달되므로 1-3초 오차 고려 불필요.
    • Polling의 목적은 클라이언트(참여자 전체)의 마이크 허용/차단 하는 것에 있음. (1-3초 오차 영향 X)
    • Virtual Thread 도입 고려 중.

부가 정보

  • Redis Key 설계:
    • Scheduler: pomodoro:scheduler (ZSET)
    • State: pomodoro:state:{roomId} (Hash - cycle, phase, maxCycles)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions