상세 내용
- 개요
- 스타트허브는 창업자가 겪는 문제를 해소하기 위해 RAG 시스템을 직접 구축하여 맞춤 지원 공고 추천, 사용자 활동 기반 AI 챗봇, 비즈니스 모델 캔버스 생성, 경쟁사 분석 등의 기능으로 창업 전 과정을 지원하는 AI 창업 지원 플랫폼입니다.
- 한국 스타트업의 생존율은 OECD 평균(45.4%)보다 낮은 33.8%이며, 약 90%가 자금 부족(38%), 시장성 부족(35%), 잘못된 비즈니스 모델(20%) 등으로 실패합니다. 이 문제에서 출발한 프로젝트입니다.
- 경쟁사 분석 등 실시간 웹 검색이 필요한 기능은 Perplexity API를 연동하여 처리하였습니다.
- 문제점 - 트래픽 증가 시 LLM 기반 서비스의 요청 시간 & 실패율 증가
- LLM 기반 기능들을 블로킹 기반의 스레드 풀 구조로 처리하고 있었습니다.
- Perplexity API의 긴 응답 지연 동안 스레드가 I/O 대기를 하게 되었습니다.
- 트래픽 증가 시 스레드 풀이 확장되어 메모리 사용량이 선형적으로 증가하였습니다.
- WebFlux의 논블로킹 기반 높은 동시성 처리라는 장점을 살리지 못하고 있었습니다.
- 해결 방법 1 - 스레드 기반 비동기를 Kotlin Coroutine으로 전환
- Spring @Async와 CompletableFuture를 CoroutineScope와 Deferred로 대체하였습니다.
- kotlinx-coroutines-reactor를 통해 WebFlux와 통합하여 비동기 처리 구조를 구축하였습니다.
- 해결 방법 2 - 블로킹 I/O를 Non-blocking으로 개선
- Perplexity API 호출의 .block()을 .awaitSingle()로 전환하였습니다.
- 중복 요청 처리의 CompletableFuture.get()을 Deferred.await()로 전환하여, I/O 대기 중 스레드를 양보하도록 개선하였습니다.
- 결과 - 동시 처리량 10배 이상 향상, 메모리 사용량 약 90% 감소
- Grafana 모니터링 서버를 구축한 후 K6 기반 부하 테스트를 실행하고 분석하였습니다.
- 전 구간 Non-blocking을 달성하여 동일 리소스로 동시 처리량을 10배 이상 향상시키고 메모리 사용량을 약 90% 감소시켰습니다.
- VU가 임계값에 도달하면 과부하되어 요청에 실패하는 현상을 대폭 개선하였습니다.
- Non-blocking 도입 전
- VU가 임계값에 도달하면 Failure Rate 값이 튀며 서비스 장애를 초래하였습니다.
- Non-blocking 도입 후
- 동시 처리량이 대폭 상승하고 HTTP Failures 0개를 달성하였습니다.