////
Search

17장 - 구글 맵

생성일
2024/08/10 05:16
태그
Interview

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(예상 도착시간 서비스)는 교통상황과 경로를 기계학습해 시간을 도출한다.
어떤 경로를 우선시 할건지도 제공한다. (큰길, 유료도로 등)
경로 중 도로상황에 의해 새로운 경로를 안내하려할 때 자신의 목적지와 출발지를 모두 포함한 수준으로 타일을 확대해서 가지고 있다가 교통사고가 발생한 타일이 있는지만 확인하고 재계산한다.
속도를 높일 수 있다.