shape

StartHub - LLM サービスをノンブロッキング化してスループットを10倍に改善する

概要

トラフィック増加時に増大するリクエストのレイテンシと失敗率を抑える

技術スタック

  • Kotlin

    Kotlin

  • Spring Boot

    Spring Boot

  • FastAPI

    FastAPI

  • MySQL

    MySQL

  • Redis

    Redis

  • Docker Compose

    Docker Compose

  • GCP

    GCP

  • GitHub Actions

    GitHub Actions

チーム

7名(バックエンド・AI2名、Web3名、App2名)

期間

2025.04 ~ 2026.04

関連リンク

メインサーバーコードAIサーバーコードWebサービスチームポートフォリオ

詳細

  1. 概要
    • StartHub は、創業者が直面する課題を解消するために RAG システムを自ら構築し、最適な支援公募のレコメンド、ユーザー活動に基づく AI チャットボット、ビジネスモデルキャンバスの生成、競合分析などの機能で創業の全プロセスを支援する AI 創業支援プラットフォームです。
    • 韓国のスタートアップの生存率は OECD 平均(45.4%)を下回る 33.8% で、約 90% が資金不足(38%)、市場性の欠如(35%)、不適切なビジネスモデル(20%)などが原因で失敗しています。この課題から出発したプロジェクトです。
    • 競合分析など、リアルタイムの Web 検索が必要な機能は 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 をノンブロッキングへ改善
    • Perplexity API 呼び出しの .block() を .awaitSingle() に変換しました。
    • 重複リクエスト処理の CompletableFuture.get() を Deferred.await() に変換し、I/O 待ちの間はスレッドを譲るように改善しました。
  5. 結果 - 同時処理量を 10 倍以上向上、メモリ使用量を約 90% 削減
    • Grafana 監視サーバーを構築したうえで、K6 ベースの負荷テストを実行し分析しました。
    • 全区間でノンブロッキングを達成し、同一リソースで同時処理量を 10 倍以上向上させ、メモリ使用量を約 90% 削減しました。
    • VU(仮想ユーザー)が閾値に達すると過負荷となりリクエストが失敗する現象を大幅に改善しました。
  6. ノンブロッキング導入前
    • VU が閾値に達すると Failure Rate が跳ね上がり、サービス障害を引き起こしていました。
    ノンブロッキング導入前 1
  7. ノンブロッキング導入後
    • 同時処理量が大幅に向上し、HTTP Failures 0 件を達成しました。
    ノンブロッキング導入後 1