なぜリンク存在確認がボトルネックだったのか
リンクの存在確認をする処理ですが、どこに負荷要因があるかというと、
- 1度のページ閲覧(PV)あたりの発行クエリ数が多く、平均的に数百クエリ/PVが発行される
- SEOの歴史的背景より、内部リンクそのものが多い
- 十分な数のリンクを表示できるようにするため、表示されるリンクよりも多くのリンクを候補としている
- キャッシュの有効期限を長くはできない
- ページに掲載されるコンテンツ(お店)の数が日々増減するため
- 対象のページ数が膨大である
- Rettyまとめページは複数の条件(エリア・カテゴリ・目的など)の組み合わせから成っており、非常に多くのページが存在する
- 短い有効期限でキャッシュが切れ、その対象が多いのでDBに直接発行されるクエリ量は大きくなる
という状況でした。
サービスはindex作成バッチとWebアプリケーションの2つから構成されていて、
- バッチ: 日時バッチでindex(RustのHashSet)を生成しS3に保存する
- Webアプリケーション: S3からindexを読み込み、それをもとに集合演算をするgRPCを提供する
となっています。