지오 데이터베이스 없이 실시간 위치 매칭 시스템을 구축한 방법
최근 나는 실시간 위치 매칭 시스템을 직접 구축했다. 이는 음식 배달, 라이드 헤일링, 물류 플랫폼 등에서 핵심적인 기능이다.
이 과정에서 나는 중요한 사실을 깨달았다. 적절한 도구만 있다면, 복잡한 지리공간 데이터베이스 없이도 충분히 이 기능을 구현할 수 있다는 것이다.
이 글에서는 RisingWave를 사용하여 실시간 위치 스트림을 처리하고, 그 데이터를 Redis에 저장해 초고속 위치 기반 검색을 구현한 방법을 소개한다.
가장 좋은 점은? 이 모든 것이 SQL 하나로 가능하다는 것이다. 단일 sink 설정만으로, 마이크로서비스나 복잡한 glue 코드 없이 구현할 수 있다.
🚗 문제: 가장 가까운 드라이버를 빠르게 찾기
사용자와 인근 드라이버 또는 식당을 매칭하는 일은 단순해 보이지만, 사실은 복잡한 요소들이 숨어 있다. 실시간 위치 업데이트, 지리공간 인덱싱, 그리고 초 단위 미만의 쿼리 응답 속도가 필요하기 때문이다.
전통적으로는 PostGIS나 MongoDB 같은 시스템을 도입하고, 여기에 많은 커스텀 로직을 작성해야 했다. 하지만 나는 더 간단한 방법을 찾았다. 바로 Redis의 지리공간 기능과 RisingWave의 스트리밍 SQL을 결합하는 것이다.
🔧 아키텍처: 스트림 처리와 실시간 서빙의 결합
파이프라인은 다음과 같은 구조로 동작한다:
RisingWave가 드라이버 또는 식당의 위치 정보를 스트림으로 수집한다.
이 데이터를 SQL로 처리, 필터링, 변형한다.
내부적으로
GEOADD명령어를 사용하여 Redis에 직접 저장한다.애플리케이션은
GEORADIUS또는GEOSEARCH명령어로 Redis에 쿼리를 보낸다.
Redis는 초저지연 데이터 서빙에 뛰어나지만, RisingWave는 전체 파이프라인을 선언적으로 구성하고 지속적으로 갱신되도록 해준다. 별도의 잡 스케줄러나 ETL 스크립트는 필요 없다.
🧪 예제: Redis에 지리공간 데이터 쓰기
예를 들어, 드라이버의 GPS 좌표가 실시간으로 스트리밍되고 있다고 하자. 아래는 RisingWave에서 정의한 테이블 스키마이다:
CREATE TABLE driver_locations (
driver_id VARCHAR,
city VARCHAR,
longitude FLOAT,
latitude FLOAT
);
이제 이 위치 데이터를 지리공간 정보로 저장하기 위해 Redis sink를 다음과 같이 정의했다:
CREATE SINK geo_sink
FROM driver_locations
WITH (
connector = 'redis',
redis.url = 'redis://127.0.0.1:6379/',
primary_key = 'driver_id,city' -- 고유성 확보
) FORMAT UPSERT ENCODE TEMPLATE (
redis_value_type = 'geospatial',
key_format = 'drivers:{city}', -- 예: drivers:san_francisco
member = 'driver_id', -- 추적할 객체
longitude = 'longitude',
latitude = 'latitude'
);
이제 Redis는 drivers:berlin, drivers:tokyo와 같은 인덱스를 유지하게 된다. 예를 들어 베를린 시내에서 반경 5km 이내의 드라이버를 조회하고 싶다면 다음과 같이 쿼리할 수 있다:
GEORADIUS drivers:berlin 13.40 52.52 5 km
Redis는 밀리초 단위로 응답을 반환한다.
✅ 이 조합이 효과적인 이유
추가 인프라 불필요: Redis는 지리공간 인덱싱을 기본 지원하며, RisingWave는 이에 직접 연결된다.
SQL 중심 설계: 모든 데이터 로직이 SQL 내에서 선언적으로 처리되므로, 복잡한 파이프라인을 따로 구축할 필요가 없다.
실시간 업데이트: 새로운 위치 데이터가 들어올 때마다 Redis가 즉시 갱신된다.
확장성과 유연성: 도시 단위로 샤딩하거나 키 포맷을 조정하거나, 여러 인덱스에 걸쳐 쿼리도 가능하다.
🧠 마무리하며
가장 인상 깊었던 점은 RisingWave와 Redis의 궁합이었다. Redis는 초고속 데이터 서빙에 최적화되어 있고, RisingWave는 스트리밍 SQL 계층을 통해 원시 데이터를 구조화하고 쿼리 가능한 상태로 변환해준다.
이 두 가지를 결합하면, 원래는 여러 개의 서비스와 복잡한 glue 코드가 필요한 위치 기반 실시간 시스템을 훨씬 더 간단하고 효율적으로 구축할 수 있다.
물류, 모빌리티, 배달 플랫폼을 만들고 있다면 이 아키텍처를 꼭 검토해볼 것을 권한다.
