1장. 근접성 서비스 - 2편
※ 내용을 1편(1, 2단계)과 2편(3, 4단계)으로 나눴습니다. ※
근접성 서비스(proximity service)는 음식점, 호텔, 극장, 박물관 등 현재 위치에서 가까운 시설을 찾는데 이용
3단계. 상세 설계
시스템 형태 중 일부 더 상세하게 살펴본다.
3.1 데이터베이스의 규모확장성
중요한 사업장 테이블과 지리 정보 색인 테이블의 규모 확장성을 살펴본다.
1) 사업장 테이블
- 한 서버에 담을 수 없을 수 있다.
- 샤당하기 좋은 후보이다. 사업장 ID를 기준으로 샤딩한다.
2) 지리 정보 색인 테이블
지오해시 테이블 구성 두 가지 방법
방법 1: 지오해시에 연결되는 모든 사장 ID를 JSON 배열로 만들어 같은 열에 저장
방법 2: 지오해시에 속한 사업장 ID 각각을 별도 열로 저장
추천: 두 번째(방안 2) 방법
이유
- 방안 1
- JSON 배열을 읽은 다음 갱신하는 사업장 ID를 찾아야한다.사업장 정보가 있는지 데이터를 전부 뒤져야 한다.
- 병렬적으로 실행되는 갱신 연산 결과로 데이터 소실을 막기 위해 락을 걸어야 한다.
- 방안 2
- 지오해시와 사업장 ID 칼럼을 합친 복합 키를 사용하면 사업장 정보를 추가하고 삭제하기 쉽다.
- 락을 사용할 필요가 없다.
3) 지리 정보 색인의 규모 확장
지리 정보 색인의 규모를 확장할 때 테이블에 보관되는 데이터의 실제 크기를 고려하지 않고 성급하게 샤딩 방법을 결정하는 실수를 한다.
읽기 연산의 빈도가 높다면 서버 한대의 CPU와 네트워크 대역폭으로 요청 전부를 감당할 수 없다.
관계형 데이터베이스의 경우 부하 분산에 두 가지 전략을 사용
- 읽기 연산을 지원하는 사본 데이터베이스를 늘리는 것.
- 다른 하나는 샤딩을 적용하는 것.
지오해시 테이블은 샤딩이 까다로우므로, 이야기하는 것은 안 좋다.
읽기 부하를 나누는 사본 데이터베이스 서버를 두는 방법이 더 좋다.
3.2 캐시
캐시 계층을 도입 전에는 정말 필요한가? 정말 좋은 결과로 이어질까라는 결론을 내리기 쉽지 않다.
- 처리 부하가 읽기 중심이고 데이터베이스 크기는 상대적으로 작으면 질의문 처리 성능은 I/O에 좌우되지 않으므로 메모리 캐시를 사용할 때와 비슷하다.
- 읽기 성능이 병목이라면 사본 데이터베이스를 증설해서 읽기 대역폭을 늘릴 수 있다.
1) 캐시 키
캐시 키는 사용자 위치의 위도 경도 정보다.
아래와 같은 문제가 있다.
- 사용자의 전화기에서 반환되는 위치 정보는 추정이다. 움직이지 않아도 측정할 때마다 조금씩 달라진다.
- 사용자가 이동하면 해당 위도 및 경도 정보도 미세하게 변경된다. 애플리케이션은 이러한 변화는 의미가 없다.
따라서 사용자의 위치 정보는 캐시로 적절하지 않다.
지오해시나 쿼드트리는 같은 격자 내 모든 사업장이 같은 해시 값을 갖도록 만들 수 있기 때문에 효과적으로 해결할 수 있다.
2) 캐시 데이터 유형
키 | 값 |
지오해시 | 해당 격자 내의 사업장 ID 목록 |
사업장 ID | 사업장 정보 객체 |
격자 내 사업장 ID
사업장 정보는 안정적이라 자주 변경되지 않는다.
특정 지오해시에 해당하는 사업장 ID목록을 미리 계산한 다음 레디스 같은 키-값 저장소에 캐시할 수 있다.
새로운 사업장을 추가하거나, 기존 사업장 정보를 편집하거나, 아예 삭제하는 경우에는 데이터베이스를 갱신하고,
캐시에 보관된 항목은 무효화(Invalidate)한다.
사용자는 네 가지(500m, 1km, 2km 그리고 5km) 검색 반경 가운데 하나를 고를 수 있다.
검색 반경에 대한 주변 사업장 검색 결과를 신속하게 제공하려면 검색 결과를 레디스에 캐시해두어야 한다.
전송지연을 방지하기 위해서는 레디스 클러스터를 전 세계에 각 지역별로 동일한 데이터를 중복해서 저장해야한다.
클라이언트 애플리케이션에 표시할 사업장 정보
키는 business_id이고 값은 사업장 이름, 주소, 사진 등의 정보를 담은 객치이다.
3.3 지역 및 가용성 구역
위치 기반 서비스를 여러 지역과 가용성 구역에 설치하면 다음과 같은 기대효과가 있다.
- 사용자와 시스템 사이의 물리적 거리를 최소한으로 줄일 수 있다.
- 트래픽을 인구에 따라 고르게 분산하는 유연성을 확보할 수 있다.
- 한국과 일본 같은 지역은 인구밀도가 높기 때문에 별도로 빼거나, 한 지역 안에서 여러 가용성 구역을 활용
- 해당 지역의 사생활 보호법에 맞는 운영이 가능
- 어떤 국가는 사용자 데이터를 다른 국가로 전송하지 못하도록 한다.
3.4 최종 설계도
- 사용자 위치와 검색 반경을 로드밸런서로 전송한다.
- 로드밸런서는 해당 요청을 LBS로 보낸다.
- LBS는 검색 요건을 만족할 지오해시 길이를 계산한다.
- LBS는 지오해시를 계산한 다음 목록에 추가한다.
- '지오해시' 레디스 서버를 호출하여 해당 지오해시에 대응하는 모든 사업장 ID 를 추출한다.
- 반환된 사업장 ID를 가지고 '사업장 정보' 레디스 서버를 조회하여 각 사업장의 상세 정보를 취득한다.
4단계. 마무리
- 지리 정보 색인 기법인 지오해시, 크드트리 그리고 S2를 알아보았다.
- 캐시를 활용한 지연 시간 감소 방법, 캐시 대상 정보, 주변 사업장을 검색하기 위한 캐시 활용법
- LBS를 여러 지역과 가용성 구역에 설치하여 가용성을 높이고 지연 시간을 줄이고 사생활 보호법을 준수한다.