[Pilot Test Analysis System] 차량 거동 분석 엔진 및 분산 처리 시스템

2 min read

주행 궤적 데이터 기반 운전자 반응 분석 알고리즘의 한계를 해결하기 위해 Rust 기반 수치 연산 워커를 새로 도입했다. 데이터 연산 로직을 백엔드에서 워커로 분리하고, 대규모 이벤트 분석을 위한 비동기 처리 파이프라인을 구축했다.

[Rust / Kinematics] 시계열 궤적 필터링 및 변동점 탐지

  • 원시 주행 데이터 내 유의미한 반응 시점을 탐지하는 과정이 불안정한 문제를 확인했다.
  • 시계열 궤적에 Kalman RTS Smoother를 적용해 노이즈가 포함된 차량 데이터를 보간했다.
  • 임계값 기반 조건 분기 로직을 제거하고 연속 구간 선형 회귀 알고리즘을 도입해, 운전자 반응 변동점을 정밀하게 탐지했다.
  • 부동소수점 연산 도중 발생할 수 있는 자릿수 상실 오류를 방지하기 위해, 경고 시점을 영점으로 설정하는 상대 시간 변환 기법을 적용했다.

[Rust / Statistics] 대용량 밀도 추정 엔진

  • Java 기반 임시 연산이나 프론트엔드 워커에 의존하여 대용량 분포 데이터 처리에 한계가 있던 문제를 해결했다.
  • 최적 대역폭을 자체적으로 계산하는 커널 밀도 추정 모듈을 Rust 환경으로 이전했다.
  • 차량 동적 반응 지연 분포 및 속도 프로파일을 Rust 워커에서 연산한 뒤, gRPC 통신으로 백엔드에 반환하도록 구현했다.
  • 데이터 수집 중 발생하는 누락 값을 안전하게 처리하기 위해 Protobuf의 Optional 필드 매핑 기능을 사용했다.

[Java / Asynchronous] 이벤트 비동기 배치 처리

  • 다수의 이벤트를 동기식으로 일괄 분석 시 클라이언트 연결이 끊어지는 타임아웃 문제를 해결했다.
  • 처리 시간이 긴 대규모 분석 요청 시 HTTP 202 Accepted 응답을 먼저 반환하도록 설계해 프록시 계층 타임아웃 오류를 방지했다.
  • 분석 요청을 할당받은 백그라운드 스레드풀이 대상 이벤트를 순차적으로 처리하고, 개별 이벤트 처리 상태를 데이터베이스에 즉각 반영하도록 구현했다.
  • 단방향 통신 규격인 SSE 채널을 구현해, 클라이언트 대시보드 측에 실시간 진행률 및 분석 작업 상태를 스트리밍했다.

[PostgreSQL / Persistence] 시계열 배열 데이터 바이너리 직렬화

  • 동역학 분석 결과로 생성되는 궤적 데이터를 관계형 테이블에 그대로 저장하기에 부적합한 스키마 구조를 수정했다.
  • 데이터베이스 스토리지 공간을 최적화하기 위해 방대한 시계열 부동소수점 배열을 바이트 스트림으로 압축해 바이너리(BYTEA) 컬럼에 저장했다.
  • 궤적 데이터와는 별개로 검색·정렬 빈도가 높은 핵심 지표는 별도의 테이블 컬럼으로 분리하여 데이터 조회 성능을 개선했다.
  • 이벤트 레코드 삭제 시, 데이터베이스 외래 키 제약 조건(ON DELETE CASCADE)에 의해 연관 거동 지표와 동역학 데이터가 함께 삭제되도록 제약 조건을 설정했다.