핵심요약
지도 보기 API의 8~10초에 달하는 응답 시간을 Coroutine Async와 동적 Window 분할 전략을 통해 2초로 단축시킨 경험을 공유합니다. 외부 API 수정 없이 클라이언트 측 최적화만으로 성능을 획기적으로 개선했습니다.
Coroutine Async를 활용한 지도 API 성능 개선
문제 상황
- 지도 보기 API에서 주변 제휴점 100곳의 최저가 정보를 조회하는 데 평균 8~10초 소요.
- 이는 표준 상품 API의 순차 처리 방식과, 해당 API를 100회 호출하는 비효율적인 구조 때문.
- 외부 표준 상품 API는 수정이 불가능한 상황.
기존 구현 방식 (동기 처리)
- Web API에서 표준 상품 API를 100번 순차적으로 호출하여 각 제휴점의 최저가 정보를 받아옴.
- 표준 상품 API 내부에서는 개별 제휴점의 상품 조회, 가격 계산, 정책 적용 등을 수행.
- 결과적으로 100개의 API 호출이 완료될 때까지 대기해야 하므로 응답 시간이 8~10초 발생.
성능 개선 방안: Coroutine Async 및 동적 Window 분할
- 핵심 전략: Web API에서 표준 상품 API 호출을 여러 개로 분할하여 병렬 처리.
- 동적 Window 분할: 제휴점 개수에 따라 호출 묶음(window) 개수를 동적으로 조절 (30개 이하: 1개, 31-60개: 2개, 61개 이상: 최대 3개).
- Coroutine Async 활용: Kotlin Coroutine의
async를 사용하여 병렬 호출 및 결과 취합. - 순서 보장 불필요: 지도 API는 결과 순서 보장이 필요 없으므로 병렬 처리에 유리.
개선 결과
- 응답 시간: 8~10초 → 2초 (사용자 대기 시간 1/4 이상 단축).
- 처리량 (TPS): 30 → 215 (동시 처리 능력 약 7배 향상).
- 사용자 경험: 거의 사용 불가능한 수준에서 실용적인 수준으로 개선.
결론
- 외부 API 수정이 불가한 상황에서도 클라이언트(BFF) 측에서 호출 구조를 재설계하여 성능 병목을 분산하고 사용자 경험을 크게 개선할 수 있음.
- 동적 window 분할과 병렬 처리는 효과적인 성능 최적화 기법임을 입증.
여기어때