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