# 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 | 커밋 메시지 | 해시 | |------|-------|------------|------| | | | | |