Description 문제/이슈
회의실 내 뽀모도로 타이머 구현이 필요.
집중시간 + 휴식시간 = 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)
Reactions are currently unavailable
You can’t perform that action at this time.
문제/이슈
해결책 제시
domain/pomodoro/application/PomodoroService구현.부가 정보