shape

스타트허브 - LLM 서비스를 논블로킹으로 전환해 처리량 10배 개선하기

프로젝트 설명

트래픽 증가 시 늘어나는 요청 시간과 실패율 잡기

기술 스택

  • Kotlin
  • Spring Boot
  • FastAPI
  • MySQL
  • Redis
  • Docker Compose
  • GCP
  • GitHub Actions

참여인원

7명 (백엔드 및 AI 2명, Web 3명, App 2명)

기간

2025.04 ~ 2026.04

상세 내용

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