////
Search

16장 - 근접성 서비스

생성일
2024/07/30 10:29
태그

1. 지원해야 하는 기능 정리

1.1. 기능적 요구사항

사용자의 위치와 검색 반경 정보에 매치되는 사업장 목록 반환
사업장 소유주가 정보룰 추가/삭제/생긴할 수 있되, 그 정보가 실시간 반영될 필요는 없음
고객은 사업장의 상세 정보를 살필 수 있어야함

1.2. 비기능 요구사항

Low latency
Data Privacy : 사생활 보호법 등 준수
High availability / Scalability : 고가용성, 확장가능성

1.3. 개략적 규모 추정

DAU = 1억
등록된 사업장 = 2억
1일 = 10^5
한 사용자 당 하루에 검색을 5회 시도
QPS = (1억 x 5) / 10^5 = 5,000

2. 청사진 그리기

API는 내 주변 사업장을 검색하는 기능과 사업장의 CURD기능을 지원하도록 설계한다.
로드밸런서
위치 기반 서비스 (LSB)
사용자 위치 기반의 주변 사업장 검색
읽기가 빈번하게 발생하며 QPS가 높다
무상태 서비스로 구성한다.
사업장 서비스
사업장 소유주가 정보를 생성/갱신/삭제 한다 = QPS가 낮다.
고객이 사업장을 조회한다 = QPS가 높다.
데이터베이스 클러스터
주-부 데이터 베이스의 형태로 구성한다.

2.1. 사업장 검색 알고리즘

2차원 검색
주어진 반경에서 사업장을 검색한다.
직관적 이지만 지나치게 단순하다.
쿼리문을 통해서 위도와 경도를 원의 반경 내에 검색하도록 구성한다.
테이블을 풀스캔 하기 때문에 효율이 별로다.
해시 기반의 지리 인덱스나 트리 기반의 지리 인덱싱을 써야한다.
균등격자, 지오해시, 카르테시안 계층 등
쿼드트리, 구글 S2, R트리 등
구현 방법이 다를 뿐 지도를 작은 영역으로 분할해 고속 검색이 가능하도록 하게 하는 것이 목표다.
균등 격자
지도를 작은 격자로 나누어 인덱싱하는 방법
하나의 사업장은 오직 한 격자에만 담을 수 있다.
문제점
사업장 분포가 균등하지 않아 일정한 격자로 나누면 데이터 분포가 균등하지 않은 문제가 있다.
격자 인접 격자를 찾기가 까다로울 수 있다.
지오해시
균등 격자보다 나은 방식이다.
2차원의 위도 경도 데이터를 1차원 문자열로 변환한다.
알고리즘 비트를 하나씩 늘려가며 재귀적으로 더 작은 격자로 분할한다.
보다 높은 정밀도를 얻을때까지 격자로 분할한다.
지오해시는 통상적으로 base32 표현법을 사용한다.
지오해시는 12단계의 정밀성을 가진다.
최적의 정밀도를 구하는 방법