feat: 다계층 인메모리 캐시(L1/L2/L3) 조회 통합 + CACHE-MONITOR 로그 #6

병합
htlee feature/multilevel-track-cache 에서 develop 로 1 commits 를 머지했습니다 2026-02-19 13:34:23 +09:00
소유자

Summary

  • L1(5min) + L2(hourly, 신규) + L3(daily) 3계층 캐시로 오늘 범위 조회를 인메모리 처리
  • HourlyTrackCache(Caffeine L2, TTL 26h, 780K entries) 신규 추가
  • CacheWarmupService: L1/L2/L3 통합 비동기 워밍업 (전용 cacheWarmupExecutor)
  • VesselTrackToCompactConverter: VesselTrack → CompactVesselTrack 변환
  • GisServiceV2: todayRange → hourlyRange(L2) + fiveMinRange(L1) 캐시 우선 조회
  • [CACHE-MONITOR] 임시 모니터링 로그 9개 파일 추가

메모리 예산

캐시 포인트/건 엔트리 수 합계
L1 (5min) ~5pt 450K ~300MB
L2 (hourly, 신규) ~60pt 780K ~2.0GB
L3 (daily) ~500pt 210K ~3.8GB

Depends on

  • MR #5 (feature/stale-data-abnormal-track → develop) 선행 머지 필요

🤖 Generated with Claude Code

## Summary - L1(5min) + L2(hourly, 신규) + L3(daily) 3계층 캐시로 오늘 범위 조회를 인메모리 처리 - HourlyTrackCache(Caffeine L2, TTL 26h, 780K entries) 신규 추가 - CacheWarmupService: L1/L2/L3 통합 비동기 워밍업 (전용 cacheWarmupExecutor) - VesselTrackToCompactConverter: VesselTrack → CompactVesselTrack 변환 - GisServiceV2: todayRange → hourlyRange(L2) + fiveMinRange(L1) 캐시 우선 조회 - [CACHE-MONITOR] 임시 모니터링 로그 9개 파일 추가 ## 메모리 예산 | 캐시 | 포인트/건 | 엔트리 수 | 합계 | |------|----------|----------|------| | L1 (5min) | ~5pt | 450K | ~300MB | | L2 (hourly, 신규) | ~60pt | 780K | ~2.0GB | | L3 (daily) | ~500pt | 210K | ~3.8GB | ## Depends on - MR #5 (feature/stale-data-abnormal-track → develop) 선행 머지 필요 🤖 Generated with [Claude Code](https://claude.com/claude-code)
htlee added 6 commits 2026-02-19 13:32:14 +09:00
- CollectDB 다중 신호 수집 → S&P Global AIS API 단일 수집으로 전환
- sig_src_cd + target_id 이중 식별자 → mmsi(VARCHAR) 단일 식별자
- t_vessel_latest_position → t_ais_position 테이블 전환
- 레거시 배치/유틸 ~30개 클래스 삭제 (VesselAggregationJobConfig, ShipKindCodeConverter 등)
- AisTargetCacheManager 기반 캐시 이중 구조 (최신위치 + 트랙 버퍼)
- CacheBasedVesselTrackDataReader + CacheBasedTrackJobListener 신규 추가
- VesselStaticStepConfig: 정적정보 CDC 변경 검출 + hourly job 편승
- SignalKindCode enum: vesselType/extraInfo 기반 선종 자동 분류
- WebSocket/STOMP 전체 mmsi 전환 (StompTrackStreamingService ~40곳)
- 모니터링/성능 최적화 코드 mmsi 기반 전환
- DataSource 설정 통합 (snpdb 단일 DB)
- AreaBoundaryCache Polygon→Geometry 캐스트 수정 (MULTIPOLYGON 지원)
- ConcurrentHashMap 적용 (VesselTrackStepConfig 동시성 버그 수정)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Hourly 집계의 N+1 DB 쿼리 패턴(60K+)을 인메모리 병합으로 교체.
5분 트랙 적재 시 FiveMinTrackCache에 보관하고 hourly job에서 캐시 기반으로
좌표 병합/통계 집계/간소화를 수행하여 DB 쿼리를 0~2회로 감소.

- FiveMinTrackCache: Caffeine 캐시 (TTL 75분, maxSize 500K)
- CacheBasedHourlyTrackReader: 캐시 기반 Reader + DB fallback
- HourlyTrackMergeProcessor: Java WKT 병합 + 비정상 검출 bulk prefetch
- @ConfigurationProperties 중복 해결 (프로그래밍 방식 Hikari 바인딩)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- CacheBasedVesselTrackDataReader: stale 그룹 스킵 제거 → 전체 통과 + 감지 로깅
- VesselTrackStepConfig: Processor에서 stale time_bucket 감지 시 비정상 궤적으로 전환
  - abnormal_type: stale_timestamp (신규 분류)
  - time_bucket: 현재 5분 버킷으로 오버라이드 (파티션 존재 보장)
  - details: 원본 time_bucket, 지연 시간(분/시), 속도/거리 정보

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
VesselBatchScheduler에서 hourlyAggregationJob 실행 시 timeBucket 파라미터에
"hourly" 문자열을 전달하여 HourlyTrackMergeProcessor의 LocalDateTime.parse() 실패.
startTime (정시 값)을 전달하도록 수정.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
이전: MMSI별 개별 SELECT (~10만 쿼리) → 수 분 소요
이후: DISTINCT ON (mmsi) 1회 bulk SELECT → 인메모리 CDC 비교

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
L1(5min) + L2(hourly, 신규) + L3(daily) 3계층 캐시로 오늘 범위 조회를
DB 쿼리 대신 인메모리 캐시에서 처리하도록 전환.

신규:
- HourlyTrackCache: Caffeine L2 캐시 (TTL 26h, 780K entries)
- CacheWarmupService: L1/L2/L3 통합 비동기 워밍업
- VesselTrackToCompactConverter: VesselTrack → CompactVesselTrack 변환

변경:
- GisServiceV2: todayRange → hourlyRange(L2) + fiveMinRange(L1) 캐시 우선 조회
- DailyTrackCacheManager: SplitQueryResult에 hourlyRange/fiveMinRange 분리
- CompositeTrackWriter: hourly 저장 시 L2 캐시 동시 적재
- HourlyAggregationJobConfig: hourly 완료 → L1 cleanup 리스너
- DailyAggregationJobConfig: daily 완료 → L2 cleanup 리스너
- AsyncConfig: cacheWarmupExecutor 전용 스레드 풀 추가
- [CACHE-MONITOR] 임시 모니터링 로그 9개 파일 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
htlee merged commit 29bf116246 into develop 2026-02-19 13:34:23 +09:00
"로그인하여 이 대화에 참여"
No reviewers
레이블 없음
마일스톤 없음
담당자 없음
참여자 1명
알림
마감일
기한이 올바르지 않거나 범위를 벗어났습니다. 'yyyy-mm-dd'형식을 사용해주십시오.

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

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