rustvalhalladockersystemdtokio
[Real-Time Intersection Predictor] 초기 프로젝트 구조 설계 및 systemd 기반 배포 파이프라인 구축
• 2 min read
차량의 RTK 및 위경도 데이터를 실시간으로 수신하여 다음 교차로를 예측하기 위한 요구사항이 대두되었다. 그러나 기존 사후 분석 시스템에서 활용하던 OSRM을 차량 내 통합보드 환경에 그대로 이식할 경우, 컨테이너 대기 상태에서조차 CPU 점유율이 한계치에 달하는 리소스 고갈 현상이 관찰되었다. 제한된 하드웨어 리소스 하에서 4채널 레이아웃 구동과 실시간 교차로 탐색 로직을 동시 처리하기 위해, 경량 라우팅 엔진(Valhalla)으로 백엔드를 교체하고 Rust 기반의 예측 코어 및 유저 모드 배포 파이프라인을 구축했다.
[Rust / Tokio] 교차로 예측 코어 아키텍처 구현
- 프로젝트 패키지 명칭을
intersection-prediction에서intersection-finder로 확정하고, Tokio 기반 비동기 애플리케이션 코어 구조를 초기화했다. rumqttc를 활용해 MQTT Broker와 통신하는MqttClient를 구현하여, 센서 데이터를 수신하는 구독(sub) 파트와 예측된 교차로 정보를 발행하는(pub) 파트의 책임을 분리했다.reqwest기반ValhallaClient를 통해 차량의 현재 위치(lat, lon) 및 방위각(heading)을 라우팅 서버로 전송하고, 반환된 교차로 정보를SqliteStore를 통해 로컬 데이터베이스에 영속화하는 인터페이스를 구현했다.
[Docker / Valhalla] 오프라인 라우팅 컨테이너 구성 및 리소스 최적화
- 통합보드의 리소스 한계를 극복하기 위해 테슬라 등에서 실무 채택한 경량 라우팅 엔진 Valhalla를 도입했다. 이를 통해 백그라운드 교차로 쿼리를 수행하면서도 전체 CPU 사용량을 30~40% 대역으로 안정화했다.
ghcr.io/valhalla/valhalla:latest이미지를 기반으로, 구동 시south-korea-latest.osm.pbf맵 데이터를 다운로드하고 타일 데이터를 자동 빌드하도록entrypoint.sh스크립트를 작성했다.
[Podman / systemd] 유저 모드(User Mode) 배포 자동화
- docker-compose 기반의 초기 배포 방식을 탈피하여 Podman과 systemd(Quadlet)를 활용한 유저 모드 기반 컨테이너 환경으로 전환했다.
.config/containers/systemd경로에valhalla.container,mqtt-broker.container,intersection-finder.service유닛 파일을 생성하고,After속성을 부여해 컨테이너 간 구동 순서를 엄격하게 제어했다.deploy.sh를 작성하여 시스템 설정 복사 및systemctl --user start명령어가 자동 수행되도록 파이프라인을 구축했으며, Mosquitto 컨테이너 구동 시 권한 충돌 방지를 위해 로컬 디렉터리 볼륨 마운트(:Z)를 비활성화했다.