feat: 캐시 O(1) 조회 + 메모리 예산 관리 + L2 블록 간소화 포팅 #86

병합
htlee feature/perf-cache-optimization 에서 develop 로 2 commits 를 머지했습니다 2026-03-02 00:13:56 +09:00
소유자

변경 사항

Phase 1: 캐시 키 기반 직접 조회

  • L1(FiveMinTrackCache), L2(HourlyTrackCache), L3(DailyTrackCacheManager)에 getTracksForVessels() O(1) 조회 메서드 추가
  • GisServiceV2 queryWithCache()에서 전체 스캔 O(n) → 키 기반 직접 조회 O(1) 전환
  • 예: L2 24시간 × 100 MMSI = 2,400회 get() vs 최대 7M 엔트리 스캔

Phase 2: 메모리 예산 관리

  • 64GB JVM 힙을 캐시(35GB) / 쿼리(20GB) / 시스템(9GB)으로 논리적 파티셔닝
  • ReentrantLock(fair=true) + Condition 기반 FIFO 대기 큐
  • GisServiceV2, ChunkedTrackStreamingService에 메모리 예약/해제 적용
  • DailyTrackCacheManager에 캐시 메모리 등록/해제 적용
  • GET /api/monitoring/cache/budget 모니터링 엔드포인트 추가

Phase 3: L2 블록 간소화

  • 6시간 이상 경과한 HourlyTrackCache 엔트리의 WKT LineStringM을 Nth-point 샘플링
  • sampleRate=2 기준 ~50% 포인트 감소 → L2 메모리 절약
  • 스케줄: 06:30, 12:30, 18:30 (1일 3회)

신규 파일

  • TrackMemoryBudgetProperties.java — @ConfigurationProperties
  • TrackMemoryBudgetManager.java — FIFO 큐 기반 예산 관리
  • TrackMemoryEstimator.java — 포인트당 112B 메모리 추정
  • MemoryBudgetExceededException.java — 503 자동 응답
  • HourlyTrackSimplifier.java — @Scheduled 간소화 실행기

테스트

  • 빌드 성공 확인 (mvn clean compile -DskipTests)
  • 운영 배포 후 캐시 HIT/MISS 비율, 쿼리 응답 시간 비교
  • /api/monitoring/cache/budget 응답 확인
## 변경 사항 ### Phase 1: 캐시 키 기반 직접 조회 - L1(FiveMinTrackCache), L2(HourlyTrackCache), L3(DailyTrackCacheManager)에 `getTracksForVessels()` O(1) 조회 메서드 추가 - GisServiceV2 `queryWithCache()`에서 전체 스캔 O(n) → 키 기반 직접 조회 O(1) 전환 - 예: L2 24시간 × 100 MMSI = 2,400회 get() vs 최대 7M 엔트리 스캔 ### Phase 2: 메모리 예산 관리 - 64GB JVM 힙을 캐시(35GB) / 쿼리(20GB) / 시스템(9GB)으로 논리적 파티셔닝 - ReentrantLock(fair=true) + Condition 기반 FIFO 대기 큐 - GisServiceV2, ChunkedTrackStreamingService에 메모리 예약/해제 적용 - DailyTrackCacheManager에 캐시 메모리 등록/해제 적용 - `GET /api/monitoring/cache/budget` 모니터링 엔드포인트 추가 ### Phase 3: L2 블록 간소화 - 6시간 이상 경과한 HourlyTrackCache 엔트리의 WKT LineStringM을 Nth-point 샘플링 - sampleRate=2 기준 ~50% 포인트 감소 → L2 메모리 절약 - 스케줄: 06:30, 12:30, 18:30 (1일 3회) ## 신규 파일 - `TrackMemoryBudgetProperties.java` — @ConfigurationProperties - `TrackMemoryBudgetManager.java` — FIFO 큐 기반 예산 관리 - `TrackMemoryEstimator.java` — 포인트당 112B 메모리 추정 - `MemoryBudgetExceededException.java` — 503 자동 응답 - `HourlyTrackSimplifier.java` — @Scheduled 간소화 실행기 ## 테스트 - [x] 빌드 성공 확인 (mvn clean compile -DskipTests) - [ ] 운영 배포 후 캐시 HIT/MISS 비율, 쿼리 응답 시간 비교 - [ ] `/api/monitoring/cache/budget` 응답 확인
htlee added 2 commits 2026-03-02 00:13:15 +09:00
Phase 1: L1/L2/L3 캐시 키 기반 직접 O(1) 조회 (전체 스캔 대체)
Phase 2: 64GB JVM 메모리 예산 논리적 파티셔닝 (캐시 35GB/쿼리 20GB)
Phase 3: L2 HourlyTrackCache 6시간 경과 엔트리 Nth-point 간소화

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
claude-bot 이 변경사항을 승인하였습니다. 2026-03-02 00:13:49 +09:00
claude-bot left a comment
멤버

MR 승인 (via /mr skill)

MR 승인 (via /mr skill)
htlee merged commit 047117033b into develop 2026-03-02 00:13:56 +09:00
htlee 삭제된 브랜치 feature/perf-cache-optimization 2026-03-02 00:13:56 +09:00
"로그인하여 이 대화에 참여"
No reviewers
레이블 없음
마일스톤 없음
담당자 없음
참여자 2명
알림
마감일
기한이 올바르지 않거나 범위를 벗어났습니다. 'yyyy-mm-dd'형식을 사용해주십시오.

마감일이 설정되지 않았습니다.

Reference: gc/signal-batch#86
No description provided.