글 검색

공개된 글의 제목과 본문을 검색합니다.

    닫기 Esc

    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단계의 정밀성을 가진다.
      • 최적의 정밀도를 구하는 방법
    전체 글 둘러보기