Before
Vintedは、ヨーロッパ最大級の中古ファッションC2Cマーケットプレイスである。2015年からElasticsearchをアイテム検索に使用してきたが、その前はSphinx検索エンジンを使用していた。長年にわたりElasticsearchは機能したものの、Vintedの成長に伴いデータ量とクエリの複雑性が増大し、Elasticsearchの限界にぶつかるようになった。
当時、Vintedは6つのElasticsearchクラスターを運用しており、それぞれ20台のデータノードと数十台のクライアントノードを持っていた。各サーバーは128コア、512GB RAM、0.5TB SSD RAID1ディスク、10Gbpsネットワークという構成だった。検索結果の一貫性を保つために複数クラスターを維持する必要があり、シャードとレプリカの継続的な微調整(fine-mingling)に多くの運用工数が費やされていた。
現状の規模は、約10億件のアクティブ検索可能アイテム、99パーセンタイルで150ms以内の2万件/秒のピークリクエスト、リアルタイムでの10,300 RPSのフィーディング(インデックス更新)レート、アイテム更新からVespa反映まで99パーセンタイルで4.64秒という厳密な要件を満たす必要があった。
検索レイテンシーの改善とインデックス反映速度の向上がビジネスに直結する重要な課題だった。Elasticsearchのリフレッシュ間隔(300秒)による遅延は、商品情報の更新が検索結果に反映されるまでの時間を大きく引き延ばしていた。また、ランキング深度の制限により、検索結果の質にも限界があった。
AI導入内容
Vintedは、長期的でスケーラブルなソリューションとしてVespaを選定した。VespaはYahoo!で開発されたオープンソースの検索エンジン・ベクトルデータベースで、ベクトル検索、語彙検索、構造化データ検索を同一クエリで実行でき、統合された機械学習モデル推論によりリアルタイムでデータに意味を与えることができる。
移行プロジェクトの概要
2023年5月に移行を開始し、同年11月までにすべてのアイテム検索トラフィックをVespaに切り替えた。2024年4月にはファセットトラフィックの切り替えも完了し、移行プロジェクトを終えた。
Search Platformチームを新設し、検索技術に精通した4名のエンジニアを集めて、アーキテクチャ、インフラ、インデックス、クエリ、メトリクス/性能テストの5つの主要領域でプロジェクトを推進した。
アーキテクチャとインフラ
Vespaアーキテクチャの採用
Littleの法則とAmdahlの法則を指針とし、システム全体のパフォーマンスに最も影響する部分の最適化に注力。Vespaのアーキテクチャにより、複数ノード間でコンテンツを分散し水平スケールが可能になった。Elasticsearchとは異なり、シャードとレプリカ設定の慎重なチューニングが不要で、コンテンツグループを追加するだけで簡単にスケールできる。
インフラ構成の刷新
VespaのApplication Package Deployment(VAP)モデルに移行し、スキーマ定義、ランキング設定、コンテンツノード仕様を含むアプリケーションモデルを単一パッケージとして管理。各コンテンツノードを3TB NVMe RAID1ディスクに移行し、HAProxyによる負荷分散を実装。将来的にはIstio Envoy proxyへの最適化も計画している。
インデックスとデータ連携
リアルタイムインデックス更新
Apache FlinkベースのSearch Indexing Pipeline(SIP)にVespaのドキュメントスキーマを採用。Vespa Kafka Connectを経由した統合から、数ヶ月前にはApache Flinkから直接書き込む方式に移行。1件のアイテム更新がアップロードされてから検索可能になるまでの時間を、99パーセンタイルで4.64秒に短縮した。
大規模再インデックスの容易化
Vespaのアーキテクチャにより、クエリサービング中に継続的なインデックス更新が可能。シャードの再バランシング、エイリアス切り替え、フィールド変更時のインデックス再作成など、Elasticsearchで必要だった複雑な運用作業が不要になった。
クエリとランキング
ハイブリッド検索の実現
Vespaは従来の語彙検索と現代的なベクトル検索の両方をサポートし、単一クエリでこれらを組み合わせられる。さらに構造化データクエリもサポートし、複雑な基準に基づくリアルタイムのフィルタリングとランキングが可能になった。
Luceneテキスト分析の統合
Elasticsearchと同じLuceneテキスト分析コンポーネントをVespaに統合する機能をオープンソースとして貢献。言語アナライザーと機能を維持しながら、Vespaの優れたスケーラビリティとパフォーマンスを享受できるようになった。
カスタムSearcherの開発
com.yahoo.search.Searcher を拡張するカスタムSearcherを開発し、事前定義されたフラットな契約(search contract)を受け入れるGolangミドルウェアサービス経由でVespaと通信。12種類のユニークなクエリを実装し、各クエリでShadowingとA/Bテストを実施して結果の質を検証した。
性能テストと監視
Vespaの組み込みPrometheusメトリクスシステムにより、クエリレイテンシからインデックススループットまで、検索プロセスのあらゆる側面を詳細に可視化。ピーク負荷のシミュレーション、インデックスパイプラインのストレステスト、様々な条件下での検索結果の精度と関連性の検証など、厳格な性能テストレジメンを実施した。
After
Vespaへの移行は、Vintedの検索プラットフォームに劇的な改善をもたらした。
サーバー台数の半減(60%削減)
Elasticsearch時代の6クラスター(各20データノード)+ 多数のクライアントノードから、1つのVespaデプロイメント(60コンテンツノード、3コンフィグノード、12コンテナノード)に集約。サーバー台数を半減させつつ、すべてのトラフィックを単一クラスターで処理する一貫性を確保した。
検索レイテンシーの2.5倍改善、インデックスレイテンシーの3倍改善
検索レイテンシーが2.5倍改善され、インデックスレイテンシーが3倍改善された。Elasticsearchの300秒のリフレッシュ間隔から、アイテム変更が検索に反映されるまでの時間がわずか5秒に短縮された。
ランキング深度の3倍以上の拡大
ランキング深度が3倍以上に拡大され、最大20万件の候補アイテムまでランキングできるようになった。これにより検索結果の関連性が大きく向上し、ビジネスへの好影響をもたらした。
運用負荷の大幅な軽減
「ホットノード」問題が解消され、負荷がすべてのノードに均等に分散されるようになった。シャードとレプリカ比の継続的な微調整に悩まされる必要がなくなり、運用工数を大幅に削減した。
将来の拡張性
現在、Vintedは21のユニークなVespaデプロイメントを、アイテム検索、画像検索、検索サジェストなど多様なユースケースで運用している。2024年末までに残るElasticsearch依存機能もVespaに完全移行し、エンドツーエンドで最適化・制御可能な統一検索インフラを確立する計画だ。
Vintedの取り組みは、大規模ECマーケットプレイスにおいて、10億件規模の検索インフラを既存のElasticsearchから次世代検索エンジンに移行し、性能と運用効率の両方を劇的に改善した大規模事例として評価されている。
公開日: 2024年9月5日
事例一覧に戻る