influxdbfluxspring-bootdata-aggregationperformance

[Telemetry API Server] 세션 기반 텔레메트리 집계 API 구현 및 InfluxDB Flux 쿼리 최적화

2 min read

대량의 시계열 데이터를 백엔드 서버로 모두 불러와 메모리 상에서 전수 조사하는 기존 방식은 OOM(Out of Memory)과 타임아웃을 유발하는 원인이었다. 특히 데이터양이 늘어나면서 밀리초 단위의 타임스탬프 처리가 전체 샤드 스캔을 유도하여 쿼리 성능이 극심하게 저하되었다. 이를 해결하기 위해 InfluxDB 측의 Flux 엔진으로 연산을 오프로딩하고, 서버 단의 커넥션 안정성을 대폭 강화하였다.

[InfluxDB Flux / DB] 데이터베이스 측 Union 쿼리 집계 연산 오프로딩

  • VehicleSummaryService를 도입하여 평균 및 최대 주행 속도, 최대 급가속/급감속, 평균 가속페달 위치, 브레이크 및 좌우회전 횟수 등 거동 데이터를 InfluxDB Flux의 union 쿼리를 통해 단일 결과셋으로 추출함.
  • DetectionSummaryService를 통해 보행자, 이륜차, 자전거, PM 및 경고 수준(warning, danger) 등 카메라 채널별 객체 인식 통계를 집계함. 초기 정규식 기반 매칭에서 개별 채널 순회 쿼리 방식으로 최적화하여 태그 유실을 방지함.
  • mean(), max(), count() 연산 수행 과정에서 정수와 실수 간의 스키마 충돌 오류가 발생하여, 모든 집계 값을 toFloat()로 명시적 캐스팅하도록 쿼리를 수정함.

[Java / OkHttp] ISO-8601 타임스탬프 변환 및 커넥션 타임아웃 안정화

  • Flux의 range() 함수가 13자리 밀리초(Epoch ms)를 초 단위로 오인하여 전체 샤드 스캔을 유발하는 버그를 픽스함. 밀리초 입력값을 java.time.Instant를 활용한 ISO-8601 문자열 포맷으로 변환 주입하여 쿼리 타임아웃 이슈를 해결함.
  • 배치 분석 연산 시 발생하는 SocketTimeoutException을 방지하기 위해 InfluxDBConfig를 추가하고 OkHttpClient를 사용해 연결, 읽기, 쓰기 타임아웃을 60초로 연장함.

[InfluxDB Flux / DB] 적분(Integral) 함수를 활용한 파생 지표 동적 산출

  • 속도 데이터(vehicle_speed)에 대해 aggregateWindow(1s, mean)integral(1h) 함수를 연계 적용하여 총 주행 거리 및 주행 시간 등 파생 지표를 서버 측에서 동적으로 산출하는 로직을 추가함.