코드몬스터 2024. 7. 28. 12:33
728x90

※ 내용을 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 최종 설계도

  1. 사용자 위치와 검색 반경을 로드밸런서로 전송한다.
  2. 로드밸런서는 해당 요청을 LBS로 보낸다.
  3. LBS는 검색 요건을 만족할 지오해시 길이를 계산한다.
  4. LBS는 지오해시를 계산한 다음 목록에 추가한다.
  5. '지오해시' 레디스 서버를 호출하여 해당 지오해시에 대응하는 모든 사업장 ID 를 추출한다.
  6. 반환된 사업장 ID를 가지고 '사업장 정보' 레디스 서버를 조회하여 각 사업장의 상세 정보를 취득한다.

4단계. 마무리

  • 지리 정보 색인 기법인 지오해시, 크드트리 그리고 S2를 알아보았다.
  • 캐시를 활용한 지연 시간 감소 방법, 캐시 대상 정보, 주변 사업장을 검색하기 위한 캐시 활용법
  • LBS를 여러 지역과 가용성 구역에 설치하여 가용성을 높이고 지연 시간을 줄이고 사생활 보호법을 준수한다.