signal-batch/docs/implementation-progress.md
HeungTak Lee 78ff307785 feat: 글로벌 동시 쿼리 제한(Semaphore) 및 쿼리 완료 시 리소스 반환 보장
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>
2026-02-06 13:36:10 +09:00

87 lines
2.5 KiB
Markdown

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