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