사용자의 현재 위치 기반 최단 거리 병원 조회 API에서 병원 데이터가 500개가 넘었고, 모든 병원에 대해 haversine으로 거리를 계산하는 부분을 개선하고 싶었다.
카카오 모빌리티 API 호출 시간이 너무 오래 걸려, 네트워크 IO에 대한 성능 개선이 필요하다.
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;
병원 20개에 대해 각각 카카오 API 호출시,
개선 전
개선 후 => 병렬 처리
12배 가량 속도가 빨라졌다.
처음엔 병렬 처리를 멀티쓰레딩을 사용해서 시도하였으나, 멀티쓰레딩은 CPU 집약적인 작업의 퍼포먼스를 향상시키는거지 우리처럼 카카오 API GET 호출같은 네트워크 IO 작업 (블로킹되지 않는 작업)에는 멀티쓰레딩이 유의미하지 않다.
⇒ 워커의 가장 중요한 목표는 I/O 작업이 아닌 CPU 집약적인 작업의 퍼포먼스를 향상시키는 것