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

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