////
Search
🏓

3장. 구글 맵

구글 맵이란 웹 기반 지도 서비스로 위성 이미지, 거리 뷰, 실시간 교통 상황, 경로 계획 등 다양한 서비스를 제공하고 있다.
구글 맵은 일반적으로 사용자가 목적지와 경로를 찾을 수 있도록 도우며 현재 DAU는 대략 10억이다.
구글 맵은 엄청나게 복잡한 제품이므로, 설계에 앞서 어떤 기능에 초점을 맞추어야 하는지 확인해야 한다.

1단계: 문제 이해 및 설계 범위 확정

요구사항 가정
10억 DAU
주요 기능은 위치 갱신, 경로 안내, ETA, 지도 표시
도로 데이터는 수 TB 수준의 가공되지 않은 데이터
ETA 고려 시, 교통 상황을 고려
이동 시, 도보, 대중교통 등 다양한 교통수단 고려
경로 안내 시 다양한 경유지 선택 가능하도록
사업장 위치 및 사진 등 다양한 정보 등의 부가적인 요소는 고려하지 않음

기능 요구사항

이번 장에서는 세 가지 주요 기능을 구현하는데 집중한다. 지원할 주 단말은 스마트폰이다.
사용자 위치 갱신
경로 안내 서비스(ETA 서비스 포함)
지도 표시

비기능 요구사항 및 제약 사항

정확도 : 사용자에게 정확한 경로를 안내해야 한다.
부드러운 경로 표시 : 클라이언트를 통해 제공되는 경로 안내 용도의 지도는 화면에 부드럽게 표시되고 갱신되어야 한다.
데이터 및 배터리 사용량 : 클라이언트는 최소한의 데이터와 배터리를 사용해야 한다.
일반적으로 널리 통용되는 가용성 및 규모 확장성 요구사항을 만족해야 한다.

설계에 앞선 기본 개념 및 용어

지도 101
측위 시스템
측위 시스템은 구 표면 상의 위치를 표현하는 체계를 의미하는데, 위경도 기반 측위의 경우 최상단에는 북극, 최하단에는 남극이 있다.
3차원 위치의 2차원 변환
이는 지도 투영법 또는 도법이라 부른다.
다양한 도법이 존재하며 각각 장단점이 존재한다. 하지만 모두 공통적으로 실제 지형의 기하학적 특성을 왜곡할 수 밖에 없다.
구글 맵은 메르카토르 도법을 조금 변경한 웹 메르카르토 도법을 택하고 있다.
지오코딩
지오코딩은 주소를 지리적 측위 시스템의 좌표로 변환하는 프로세스다.
지오코딩 결과를 반대로 주소로 변환하는 과정은 역지오코딩이라고 한다.
지오코딩을 수행하는 방법 중 하나는 인터폴레이션으로 GIS와 같은 다양한 시스템이 제공하는 데이터를 결합한다는 뜻이다.
지오해싱
지도 위 특정 영역을 문자열에 대응시키는 인코딩 체계다.
지오해싱은 2차원의 평면 공간으로 표현된 지리적 영역 위의 격자를 더 작은 격자로 재귀적으로 분할해 나간다.
지도 표시
지도를 화면에 표시할 때 가장 기본이 되는 개념은 타일이다. 지도 전부를 한의 이미지로 표현하는 대신 쪼개어 타일로 표시하는 것이다.
경로 안내 알고리즘을 위한 도로 데이터 처리
대부분의 경로 탐색 알고리즘은 데익스트라나 A* 경로 탐색 알고리즘의 변형으로 그 중 최적인 하나를 결정하는 것은 너무 구체적이므로 다루지 않는다.
중요한 것은 모든 경로 탐색 알고리즘이 교차로를 노드로 도로는 노드를 잇는 선으로 표현하는 그래프형 자료구조로 가정하고 푼다는 것이다.
다만 이때, 경로가 여러 타일에 걸쳐있는 경우, 참조를 통해 접근해야 한다.
계층적 경로 안내 타일
경로 안내가 효과적으로 동작하려면 여러 구체성 수준을 갖춘 도로 데이터가 필요하다.
도로가 세밀하게 퍼져있는 경우, 상, 순환도로 등 큰 관할구를 잇는 도로는 중, 다른 도로와 도로를 잇는 고속도로는 하 등으로 체계화시켜 관리한다.

개략적 규모 추정

저장소 사용량
세계 지도
지원하는 확대 수준 별로 지도 타일을 구성해두어야 한다. 그래야 더 효율적으로 데이터를 제공해줄 수 있다.
고수준의 확대 수준을 가질수록 각 타일을 4분할하여 접근한다고 가정하면 대략 21개의 확대 수준을 가지는 경우, 4^0부터 4^21까지의 총합 * 각 타일별 이미지 용량 크기 수준의 데이터 저장소가 필요할 것이다.
그 외의 사막, 바다 등 조회가 자주 일어나지 않아 압축이 가능한 데이터를 압축한다고 가정하면 용량을 절감할 수 있을 것이다.
서버 대역폭
먼저 서버가 처리하는 요청은 크게 두 가지다. 첫 번째는 경로 요청이고 사용자 위치 갱신 요청이다.
경로 안내 요청의 경우, DAU 10억, 가정한 경로 안내 기능 평균 사용 시간인 주당 35분을 계산해보면 하루에 대략 50억분이라는 계산이 나오고 이를 60으로 나누면 대략 1초당 300만 회라는 QPS 수치가 나온다.
사용자 이동 속도나 그외 정확도 저하를 감수한다면 갱신 기간을 늘려 QPS를 더 줄일 수 있다.

2단계 : 개략적 설계안 제시 및 동의 구하기

개략적 설계안

위치 서비스
본 설계안은 t초마다 자기 위치를 전송한다고 가정하며, 이때의 t 값은 설정 가능한 값이다.
이렇게 주기적으로 위치 정보를 전송하면 몇 가지 좋은 점이 있다.
첫 번째는 해당 데이터 스트림을 활용하여 시스템을 점차 개선할 수 있다.
두 번째는 클라이언트가 보내는 위치 정보가 거의 실시간 정보에 가까우므로 ETA를 더 정확하게 산출할 수 있다.
이렇게 최적화를 시켜도 여전히 구글 맵과 같은 서비스는 많은 쓰기 요청을 처리하므로 데이터베이스론 쓰기 요청에 적합한 카산드라 같은 데이터베이스가 적절할 것이다.
경로 안내 서비스
이 서비스는 A에서 B 지점으로 가는 적절한 경로를 찾아 주는 역할을 담당한다.
경로 재탐색이나 교통 상황 변화 고려 등은 상세 설계를 거치며 구체적으로 잡아나가는 것이 낫다.
지도 표시
지도 표시를 위해 필요한 타일 수십 PB를 클라이언트에게 가지고 있도록 하는 것은 바람직하지 못하다.
그렇다면 클라이언트는 어떻게 서버로부터 타일을 받아올 수 있을까?
미리 타일들을 만들어두고 CDN으로 제공하는 것이 바람직할 수 있다.
일부 데이터를 클라이언트 내부에 캐시해두면 더 쾌적한 성능을 제공할 수 있을 것이다.

3단계: 상세 설계

데이터 모델

경로 안내 타일
이름, 관할구, 위도, 경도 등의 도로 부속 정보 메타데이터들은 그래프 자료 구조 형태로 가공되지 않으므로 경로 안내 타일 처리 서비스를 사용해 경로 안내 타일로 변환해야 한다.
이렇게 경로 안내 타일을 가공할 땐, 상, 중, 하로 만들어 도로망 데이터를 점진적으로 소비할 수 있도록 한다.
이렇게 만들어진 타일은 S3에 저장해두고 그 파일을 이용할 경로 안내 서비스에서 캐싱하여 사용한다.
사용자 위치 데이터
사용자의 위치 데이터를 저장하려면 엄청난 쓰기 연산을 지원하며 수평적 규모 확장에 용이해야 하므로 카산드라 데이터베이스가 적절한 선택이 되어줄 수 있다.
지오코딩 데이터베이스
주소는 경로 계획 서비스에 전달되기 전에, 위도/경도 쌍으로 변환되어야 한다.
서비스
위치 서비스
사용자 위치 데이터 저장에는 키-값 저장소를 사용하며 역시 쓰기 연산 지원에 탁월한 데이터베이스를 선택한다.
지도 표시
WebGL 기술을 채택하면 네트워크를 통해 이미지를 전송하는 대신 경로와 다각형 등의 벡터 정보를 보내어 지도를 그리게끔하여 압축률에 따른 네트워크 대역폭 절감 효과를 볼 수 있다.
또 다른 장점이 될 수 있는 것은 매끄러운 확대를 제공한 유저 경험 향상이다.
경로 안내 서비스
지오코딩 서비스
경로 계획 서비스
현재 교통 상황과 도로 상태에 입각하여 이동 시간 측면에서 최적화된 경로를 제안하는 역할을 담당한다.
최단 경로 서비스
출발지와 목적지 위도/경도를 입력으로 받아 k개의 최단 경로를 반환하는 서비스다.
최당 경로 서비스는 객체 저장소에 저장된 경로 안태 타일에 대해 A* 경로 탐색 알고리즘의 한 형태로 실행한다.
입력으로 출발지와 목적지의 위도, 경로를 받아, 지오 해시로 변환한다음 출발지와 목적지 경로 안내 타일을 획득한다.
출발지 타일에서 시작하여 그래프 자료 구조를 탐색해 나간다. 탐색 범위 확장에 필요한 타일은 객체 저장소에서 획득한다.
예상 도착 시간 서비스
최단 경로 목록을 수신하면 예상 도착 시간 서비스를 호출하여 경로 별, 소요 시간 추정치를 구한다.
순위 결정 서비스
사용자가 정의한 필터링 조건(유료 도료 제외, 고속도로 제외 등)을 적용하여 남은 경로들을 소요 시간 별로 정렬하여 제공한다.
중요 정보 갱신 서비스들
이 부류의 기능들은 카프카 위치 데이터 스트림을 구독하고 있다가 중요 데이터를 비동기적으로 업데이트하여 그 상태를 항상 최신으로 유지하는 역할을 담당한다.
적응형 ETA와 경로 변경
이 문제를 해결하려면 현재 경로 안내를 받고 있는 모든 사용자를 추적하면서 교통 상황이 달라지는 이벤트가 발생할 때마다 각 사용자의 ETA를 변경해주어야 한다.
그렇다면 현재 경로 안내를 받고 있는 사용자는 어떻게 추적할까? 그리고 수백만 경로 가운데 교통 상황 변화에 영향을 받는 경로와 사용자를 효율적으로 찾아낼 방법은 무엇일까?
너무 구체적이라 다루지 않겠다..

4단계: 마무리

구글 맵은 위치 갱신, ETA, 경로 계획, 지도 표시 등의 핵심 기능을 지원한다.
이 시스템의 확장에 관심이 있다면 추가적으로 기업 고객 대상, 중간 경유지 설정 기능을 제공하는 것을 고려해보면 좋을 것이다.