[TIL] 지리 공간 좌표 인덱싱, 카카오 API 호출 속도 개선

김시원·2023년 5월 31일
1

TIL

목록 보기
34/50
post-custom-banner

📌 Issues encountered

Issue #1

사용자의 현재 위치 기반 최단 거리 병원 조회 API에서 병원 데이터가 500개가 넘었고, 모든 병원에 대해 haversine으로 거리를 계산하는 부분을 개선하고 싶었다.

Issue #2

카카오 모빌리티 API 호출 시간이 너무 오래 걸려, 네트워크 IO에 대한 성능 개선이 필요하다.

📌 What I tried

Issue #1

  1. 그래프 알고리즘을 사용해서 사용자의 위치 위도, 경도가 입력되었을 때 이를 하나의 노드로서 그래프에 넣어주고, 이미 병원간의 거리가 가중치로 저장되어 있는 그래프를 순회해서 매번 거리를 계산하는 것이 아닌, 가중치를 활용해서 병원을 순회하고자 하였다. 그러나, 이 방법은 이미 우리는 병원 데이터를 DB에 넣어뒀는데 그래프 자료구조를 또 메모리에 저장해주어야 하기 때문에 비효율적이고, 어떤 병원끼리 연결성을 가질지에 대한 기준이 불분명하였다.
  2. MySQL Spatial Index라는 키워드를 찾아냈고, 우리의 병원 데이터는 500여개정도 밖에 되지 않아, ST_Distance_Sphere 함수만 사용해도 전체 병원 거리 조회가 6ms밖에 되지 않아 충분히 우리 프로젝트 성능 개선에 도움이 된 것 같다.
SET @patient_loc = Point(127.0767018, 37.1886234);
SELECT hospital_id, name, ST_Distance_Sphere(POINT(longitude, latitude), @patient_loc) as 'distance' FROM hospitals;

Issue #2

병원 20개에 대해 각각 카카오 API 호출시,

  • 개선 전

  • 개선 후 => 병렬 처리
    스크린샷 2023-05-31 180518

12배 가량 속도가 빨라졌다.

처음엔 병렬 처리를 멀티쓰레딩을 사용해서 시도하였으나, 멀티쓰레딩은 CPU 집약적인 작업의 퍼포먼스를 향상시키는거지 우리처럼 카카오 API GET 호출같은 네트워크 IO 작업 (블로킹되지 않는 작업)에는 멀티쓰레딩이 유의미하지 않다.
⇒ 워커의 가장 중요한 목표는 I/O 작업이 아닌 CPU 집약적인 작업의 퍼포먼스를 향상시키는 것

post-custom-banner

0개의 댓글