1. 지원해야 하는 기능 정리
•
10억 DAU
•
위치 갱신, 경로 안내, ETA 지도 표시 등에 초점 맞추기
•
수 TB의 가공되지 않은 도로 데이터 저장
•
교통 상황을 고려해 정확한 도착시간 계산
•
자동차 이외에도 다양한 이동수단 고려
1.1. 기능적 요구사항
•
사용자 위치 갱신
•
경로 안내 서비스
•
지도 표시
1.2. 비기능적 요구사항
•
정확도 : 잘못된 경로를 안내하면 안된다.
•
부드러운 경로 표시 : 지도 안내를 부드럽게 표시
•
데이터 및 배터리 사용량 : 가능한 최소한의 데이터와 배터리 사용
•
일반적으로 널리 통용되는 가용성/규모 확장성 요구사항을 만족
1.3. 지도101
1.3.1. 측위 시스템
•
세계는 축을 중심으로 회전하는 구다
•
측위 시스템은 구 표면 상의 위치를 표현하는 체계로, 위경도 기반의 시스템의 경우 최상단에는 북극, 최하단에는 남극이 있다.
•
이 시스템에서 위도는 주어진 위치가 얼마나 북/남쪽인지 나타내고, 경도는 동/서쪽인지 나타낸다.
1.3.2. 3차원 위치의 2차원 변환
•
지도 투영법(도법) = 3차원의 구를 2차원의 평면에 대응 시키는 방법
•
다양한 도법이 존재하며 각각 장/단점을 가진다.
•
구글 맵은 메르카토르 도법을 조금 변경한 웹 메르카토르 도법을 사용한다.
1.3.3. 지오코딩
•
주소를 지리적 측위 시스템의 좌표로 변환하는 프로세스
•
지오코딩 반대의 프로세스를 역 지오코딩이라 부름
•
수행하는 한 방법은 인터폴레이션이다.
•
GIS는 도로망을 지리적 좌표 공간에 대응시키는 제공 방법 중 하나
1.3.4. 지오해싱
•
지도 위 특정 영역을 영문자와 숫자로 구성된 짧은 문자열에 대응시키는 인코딩 체계
•
어떤 격자를 재귀적으로 분할한 결과로 생성된 더 작은 격자에는 0부터 3까지 번호를 부여함
•
지오해싱의 용도는 다양하나 본 설계안은 맵 타임 관리에 지오해싱을 적용함
1.3.5. 지도표시
•
지도 렌더링은 가장 기본적으로 지도를 작은 타일로 쪼개서 표시하는 방법이 있다.
•
지도의 확대/축소에 따라 다양한 종류의 타일을 준비해야 한다.
1.3.6. 경로 안내 알고리즘을 위한 도로 데이터 처리
•
대부분의 경로 탐색 알고리즘은 다익스트라 알고리즘이나 A* 알고리즘의 변종이다.
•
경로탐색 알고리즘은 교차로를 노드로, 도로는 노드를 잇는 엣지로 표현하여 그래프 자료구조를 가진다.
•
전 세계 도로망을 작은 단위로 분할하는 타일 기법과 유사하게 세계를 작은 격자로 나누고, 각 격자안 도로망을 노드와 선으로 구성된 그래프 자료로 변환한다.
•
도로망을 언제든 불러올 수 있는 경로 안내 타일로 분할해 놓으면 경로 탐색 알고리즘이 동작하는 데 필요한 메모리 요구량을 낮출 수 있고, 한번에 처리해야 하는 양이 줄어들어 성능도 좋아진다.
1.3.7. 계층적 경로 안내 타일
•
경로 안내가 효과적으로 동작하려면 필요한 수준의 구체성을 갖춘 도로 데이터가 필요하다.
•
메모리나 효율성을 위해서 구체성 정도를 상, 중, 하로 구분하여 세 가지 종류의 경로 안내 타일을 준비한다.
◦
구체성에 따라 상 > 중 > 하로 두며 고속도로나 간선도로 등을 저장한다.
2. 청사진 그리기
2.1. 위치 서비스
•
사용자 위치 갱신을 너무 짧게 하면 서버에 부하가 생기고 비효율적이다.
•
클라이언트가 자신의 버퍼를 만들고 15초 정도마다 보내면 조금 더 효율적으로 보낼 수 있다.
2.2. 경로안내
•
경로안내는 최단 시간을 계산해야 하기 때문에 약간의 레이턴시는 감내할 수 있다.
2.3. 지도표시
•
지도 표시는 미리 쪼개둔 지도 데이터를 CDN에 캐싱해서 클라이언트에 전달하도록 한다.
◦
타일 단위로 쪼개는건 지오 해시를 통해서 나눠두는 것이다.
•
단일 서버 운용시엔 레이턴시가 너~무 길기 때문이다.
•
그리고 타일을 미리 쪼개두고 CDN을 쓰며 규모확장이 용이하다!
•
거기에 클라이언트 측에 캐시까지 쓴다면?
◦
Wow 비용과 속도 모두 잡았다!
•
지오 해시는 계산이 쉬워서 클라이언트 측에서 계산 후 원하는 타일을 가져가면 된다.
◦
단, 서버 배포보다 클라 배포가 더 시간이 많이 걸려서 문제가 될 수 있다.
•
이 문제를 해결하기 위해 이런 계산만을 해주는 서비스를 독립적으로 분리하는 것이다. (클라가 위도 경도를 주면 계산 후 전달)
3. 실제 설계
3.1. 데이터 모델
•
경로 안내 타일은 일반적으로 인접 리스트 형태로 보관한다.
◦
그런데 해당 설계안의 타일데이터를 모두 담기엔 용량이 너무 큼
◦
가장 효율적 방법은 S3같은 객체 저장소에 파일을 보관/캐싱 하는 것
◦
지오해시 기준으로 분류해두면 위/경도가 주어졌을때 신속하게 찾을 수 있다.
•
카산드라를 통해서 사용자 위치정보를 저장한다.
◦
카산드라는 규모확장이 쉽다.
◦
사용자 위치정보는 다양하게(교통상황, 도로 데이터 갱신 등) 이용된다.
•
지오코딩 데이터베이스는 키/값 데이터베이스로 저장한다.
•
지도 이미지는 S3클라우드 저장소를 이용하고, CDN을 이용해 레이턴시를 줄인다.
3.2. 서비스
•
위치 서비스는 키/값 저장소를 사용한다.
◦
쓰기 연산이 자주 발생하기 때문에 이에 탁월하다.
◦
데이터 일관성보다는 가용성이 더 중점을 둬야한다.
•
사용자 위치 데이터는 다양하게 사용된다.
3.3. 지도표시
•
확대 수준별 타일을 제공한다.
•
최적화를 위해 벡터를 이용한다.
◦
일반 이미지에 비해 월등한 압축률 덕에 네트워크 대역폭을 아낄 수 있다.
3.4. 경로안내 서비스
•
지오코딩 서비스를 통해 위도와 경도를 변환한다.
•
경로 계획 서비스를 통해서 교통상황/도로 상태에 입각해 최적화된 경로를 제안한다.
•
대략적으로 아래 프로세스로 진행
◦
위도 경도를 받아 지오해시로 변환
◦
출발지 타일에서 시작해 그래프로 탐색 시작
•
ETA(예상 도착시간 서비스)는 교통상황과 경로를 기계학습해 시간을 도출한다.
•
어떤 경로를 우선시 할건지도 제공한다. (큰길, 유료도로 등)
•
경로 중 도로상황에 의해 새로운 경로를 안내하려할 때 자신의 목적지와 출발지를 모두 포함한 수준으로 타일을 확대해서 가지고 있다가 교통사고가 발생한 타일이 있는지만 확인하고 재계산한다.
◦
속도를 높일 수 있다.