16장 - 근접성 서비스
- 생성일
- 2024년 7월 30일 PM 7: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단계의 정밀성을 가진다.

- 최적의 정밀도를 구하는 방법
