GMOメディア(プリ小説)
GMOメディア「プリ小説」、秒間平均50qps超の検索でAlgoliaの従量課金が負担に。Elasticsearchへ移行しコストを約50%削減
GMOメディアが運営するチャット型小説投稿サービス「プリ小説」では、秒間平均で50qpsを超える検索リクエストが発生しており、Algoliaの従量課金制では金銭的なコストがかなりネックになっていた。固定費用でスケーラビリティの面でも適切と判断したElasticsearchへの移行を2022年12月から検討開始。当初はElastic App Searchを採用して2023年3月に段階リリースしたが、形態素解析後の単語間のAND検索ができないなど検索クエリの細かな制御ができず、4〜6月にいったんAlgoliaへ戻したうえで7月にElasticsearch本体へ急遽切り替えた。結果としてコストは約50%削減、リクエストレイテンシは平均50msに収まり、Algoliaでは対応していなかった日本語の除外検索も提供できるようになった。
課題
秒間平均50qps超の検索でAlgoliaの従量課金が重く、コストがネックになっていた
アプローチ
固定費用のElasticsearchへ移行。App Searchでの躓きを経て本体へ切り替えた
効果
コスト約50%削減、平均レイテンシ50ms、日本語の除外検索にも対応
背景
GMOメディアが運営する「プリ小説」は、夢小説・二次創作を扱うチャット型の小説投稿サービスで、作品検索がユーザー体験の中心にある。全文検索にはAlgoliaを利用していたが、プリ小説では秒間平均で50qpsを超える検索リクエストが発生しており、リクエスト数に応じて課金されるAlgoliaの従量課金制では金銭的なコストがかなりネックになっていた。サービスの成長に伴って検索リクエストが増えるほどコストも膨らむ構造だったため、固定費用の体系であり、スケーラビリティの観点からも適切だと判断されたElasticsearchへの移行が検討されることになった。フロントエンドエンジニアが主担当となり、検索品質をAlgolia利用時から落とさないことを前提に、2022年12月から移行プロジェクトが動き出した。
移行のプロセス
移行は約8ヶ月にわたって段階的に進められた。
- 2022年12月: 調査と移行手順の作成
- 2023年1月: バックエンド・フロントエンドの実装
- 2023年2月: バッチ作成とテスト
- 2023年3月: Elastic App Searchでの段階リリース開始
- 2023年4〜6月: ユーザーからの不満を受け、いったんAlgoliaへ戻す
- 2023年7月: Elasticsearch本体へ急遽切り替え、夏休み直前に100%リリースできる状態に到達
当初採用したElastic App Searchは、形態素解析後の単語間のAND検索ができないなど検索クエリを細かく制御できず、Algoliaと同等の検索体験を再現しきれなかったことが切り替えの理由になった。実装はNode.js・TypeScriptとElastic社提供のElasticsearch Node.jsクライアントで行い、インスタンスは「Hot data and Content tier」を選択。Google Cloud上のCloud Functions v2やFirestoreと組み合わせ、Kuromojiによる形態素解析の設定は試行錯誤を重ねた。運用面ではCloud Monitoringでレイテンシ・インスタンス数・QPS・エラー数を監視し、ElasticsearchのCPU利用率は40%超で要注意、レイテンシの閾値は100msという基準を設けている。移行の途中ではインスタンス性能の見積もりを誤り、3回ほど一時的に検索機能が停止する事態も発生した。
移行前後の変化
| 指標 | Before | After | |
|---|---|---|---|
| 検索基盤 | Algolia(従量課金制) | Elasticsearch(固定費用、Hot data and Content tier) | |
| コスト | — | 約50%削減 | |
| リクエストレイテンシ | — | 平均50ms | |
| 日本語の除外検索 | 非対応 | 対応 | |
| 検索リクエスト量 | 秒間平均50qps超 | 秒間平均50qps超 |
結果
最終的にコストは約50%削減された。リクエストレイテンシは平均50msに収まり、検索品質もAlgolia利用時とほぼ変わらない水準を保てている。さらにAlgoliaでは対応していなかった日本語の除外検索を新たに提供できるようになり、コスト面だけでなく機能面でも前進した。一方で移行過程では、インスタンス性能の誤りによって3回ほど一時的に検索機能が停止するなどの代償もあった。
学び
SaaSの利便性を手放して自前運用に寄せる場合、インスタンス性能の見積もりや形態素解析の設定といった、それまで意識せずに済んでいた部分が一気に自分たちの責任範囲になる。当初採用したElastic App Searchのように、抽象度の高いレイヤーでは既存の検索体験を再現しきれないこともあり、検索クエリをどこまで細かく制御できるかを事前に確かめておくことが重要になる。
