Phase 1.1 + 1.2: WebSocket 리플레이 요청 동시 부하 제어 - ActiveQueryManager에 Fair Semaphore 기반 글로벌 동시 쿼리 제한 추가 (기본 30개) - @Async 스트리밍 메서드 내에서 슬롯 획득 (인바운드 채널 블로킹 방지) - 쿼리 완료/실패/취소 시 finally 블록에서 반드시 리소스 반환 - 글로벌 Semaphore 슬롯 반환 - 세션별 쿼리 카운트 감소 (기존 누락 수정) - ActiveQueryManager 쿼리 정리 - TrackQueryInterceptor 세션 제한값 외부 설정화 (@Value) - application-prod.yml에 websocket.query 설정 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2.5 KiB
2.5 KiB
WebSocket 부하 제어 개선 — 구현 진행 상황
브랜치:
feat/websocket-load-control시작일: 2026-02-06
DB 커넥션 풀 분배 설계 (총 250개)
| DataSource | AS-IS | TO-BE | 비고 |
|---|---|---|---|
| Query | 60 (min 10) | 120 (min 20) | WebSocket 스트리밍 + REST API 주 사용 |
| Collect | 20 (min 5) | 80 (min 15) | 배치 Reader, 신호 수집 조회 |
| Batch | 20 (min 10) | 30 (min 5) | Spring Batch 메타데이터 |
| 예비 | - | 20 | 운영 여유분 |
| 합계 | 100 | 250 | DB 서버 500 중 250 사용 |
글로벌 동시 쿼리 제한 산정
- Query 풀 120개 / 쿼리당 평균 3커넥션 = 40
- 보수적 적용: 30개 (REST API, 헬스체크 등에 여유분 확보)
Phase 1 — 긴급 안정화
-
1.1 글로벌 동시 쿼리 제한 (Semaphore + Fair Queue)
- TrackQueryInterceptor에 Semaphore 기반 글로벌 제한 추가
- application-prod.yml에 websocket 설정 외부화
- 상태: 대기
-
1.2 쿼리 완료 시 리소스 반환 보장
- ChunkedTrackStreamingService finally 블록에 releaseQuery() 추가
- StompTrackStreamingService finally 블록에 releaseQuery() 추가
- 상태: 대기
-
1.3 CachedThreadPool → 제한된 ThreadPoolExecutor 교체
- CancellableQueryManager의 newCachedThreadPool 교체
- 상태: 대기
-
1.4 DB 커넥션 풀 재분배 (prod)
- application-prod.yml Query/Collect/Batch 풀 사이즈 조정
- 상태: 대기
Phase 2 — 취소 및 정리 로직 완성
-
2.1 ChunkedTrackStreamingService 쿼리 취소 구현
- AtomicBoolean 취소 플래그 + processTableRange 내 체크포인트
- 상태: 대기
-
2.2 쿼리 관리 시스템 통합
- ActiveQueryManager를 단일 진실의 원천으로 통합
- 상태: 대기
Phase 3 — 백프레셔 고도화
-
3.1 콜백 기반 버퍼 추적
- CompletableFuture + Thread.sleep(100) → 즉시 감소 전환
- 상태: 대기
-
3.2 적응형 전송 지연
- 버퍼 사용률 기반 동적 지연
- 상태: 대기
Phase 4 — 설정 외부화 및 모니터링
-
4.1 WebSocketProperties 설정 클래스
- 하드코딩된 설정값을 application.yml로 외부화
- 상태: 대기
-
4.2 모니터링 엔드포인트
- /api/v1/monitor/websocket/status
- 상태: 대기
커밋 이력
| 날짜 | Phase | 커밋 메시지 | 해시 |
|---|---|---|---|