한눈에 보기
BARO는 승객 앱 · 차량, 서비스가 도는 AWS, 분석 · 관측을 맡은 온프레미스(OpenStack K3s)로 나뉘어요. AWS와 온프레미스는 Site-to-Site VPN으로 이어져 있어요.
ECS Fargate ×7EC2: Kafka · MosquittoIPsec VPN
1차량 위치가 흐르는 길
차량 1500대가 3초마다 위치를 MQTT(QoS0)로 보내요. control은 공유 구독으로 받아서, 인스턴스를 늘려도 한 메시지는 한 곳에서만 처리돼요.
vehicles/{id}/telemetry$share/control-service
관제 화면에는 SSE로 곧장 뿌리고, 나머지는 Kafka vehicle-data-topic으로 보내요. key=carId라 같은 차량의 위치는 순서가 보장돼요.
4 partitionskey = carId
dispatch는 10초 넘은 메시지를 버리고 빈 차만 Valkey GEO에 올려요. 온프레미스 consumer는 VPN 너머에서 같은 토픽을 받아 TimescaleDB에 쌓아요.
GEO dispatch:cars:idle:geohypertable vehicle_data
2호출 한 건이 배차되기까지
호출은 ALB → gateway를 지나요. JWT는 user가 발급하고 gateway 한 곳에서만 검증해요. dispatch는 Kakao로 요금 · 경로를 먼저 계산해 보여줘요(PRE배차).
X-Authenticated-User-Idquote TTL 10 min
확정하면 15km 안 후보 10대를 찾고, 300초 넘게 소식 없는 차는 빼고, SETNX 선점 락(30초)으로 두 승객이 같은 차를 잡지 못하게 해요. 배차는 트랜잭션으로 저장해요.
GEOSEARCH 15kmSETNX TTL 30s
명령은 MQTT(QoS1)로 차량에 가고 ACK가 돌아와요. 10초 안에 ACK가 없으면 다음 차량으로 자동 재배차해요.
vehicles/{id}/commandsACK timeout 10s
승객 앱엔 SSE로 차량 위치와 도착 상태(픽업 → 목적지)를 실시간으로 밀어줘요.
SSE vehicle-location
3운행이 끝나면 — 재배치
목적지 도착 이벤트를 받은 control이 relocation에 비동기로 알려요. 배차 흐름과 엮이지 않도록 분리한 구조예요.
ARRIVED(to_dest)202 Accepted
PostGIS로 주변 승차대에 점수(0.7 · 수요 − 0.3 · 거리)를 매겨 가장 좋은 곳으로 RELOCATE. 이동 중에도 배차 가능한 상태라 호출이 오면 바로 받아요.
ST_DWithin 10→30kmstatus = relocating
4밤사이 — 수요 학습
매일 02:00, Airflow가 VPN 너머 internal ALB로 전날 배차 데이터를 가져와 승차대 × 요일 × 시간대 수요를 집계해요.
gzip CSV exportX-Internal-Api-Key
XGBoost로 학습한 승차대 가중치를 relocation에 보내면, 다음 재배치부터 바로 반영돼요.
weights 0–1
5지켜보는 눈 — 관측
온프레미스 Prometheus가 VPN 너머 서비스 · Kafka · EC2 지표를 모으고, 알림은 AWS · 온프레미스 · 서비스 3개 Slack 채널로 나눠 보내요.
JMX :9404CloudWatch exporterAlertmanager → Slack