위치 기반 서비스(LBS)를 만들 때 어떤 요구사항들이 필요할까?

Case

  1. 표시할 사업장이 충분하지 않을 경우 검색 반경을 시스템이 알아서 늘려야 한다. 어떻게 해야 하나?

(18페이지) 지오해시 값의 마지막 비트를 삭제하여 얻은 지오해시 값을 사용해 주변 사업장을 검색한다.

원하는 범위 내에 사업장이 없을 때마다 한 비트를 삭제한다.

  1. 가까운 순으로 보여주세요
  2. 해당 거리안에 있는 모든 사업장을 보여주세요

기존 서비스가 있는가?

보통 서비스를 만들려고 하면 기존 인프라를 사용하려고 한다. (어째 요구사항에 맞는 기술들보다 우선순위가 높다;;)

사실 geospatial 인덱스를 지원하는 몽고디비를 쓰면 끝 아닌가?

이러면 몽고디비랑 mysql처럼 종류 다른 디비를 여러개 쓰는데 이게 폴리글랏임. (관리 누가 할것임?도 고려)

store 몽고 DB
id name { id: "ABCD", latitude: 127.23131 longitude: 36.642, store_id: 1},{ id: "FGHD", latitude: 127.23131 longitude: 36.642, store_id: 2}
1 장난감 가게 { id: ""FGHD"", latitude: 127.23131 longitude: 36.642, store_id: 2}{ id: ""ABCD"", latitude: 127.23131 longitude: 36.642, store_id: 1},
2 옷가게 SELECT * FROM store where id in [1,2]
O(1)

어떻게 구현할 것인가?

DB 구조는 Master/Slave로 나뉘어서 마스터(쓰기) 테이블 1개, 슬레이브(읽기, 복사본 저장) 테이블 3개 식으로 구성한다. 로드밸런서를 클라이언트 앞에 두고 LBS는 읽기만, 사업장 서비스는 쓰기만 별도 서비스로 수행한다.

공통적인 인덱스 구현법은 지도를 작은 영역으로 분할하고 고속 검색이 가능하도록 색인을 만드는 것이다.

해시 기반

지오해시를 사용해서 구현한다. 지오해시는 2차원의 위도 경도 데이터를 1차원의 문자열로 변환한다.

지오해시 인덱스 테이블을 만들어서 인덱스로 O(1) 정도 성능을 내서 빠르게 탐색한다.