/note/tech

RettyのDBの負荷を7割減した取り組み

なぜリンク存在確認がボトルネックだったのか

リンクの存在確認をする処理ですが、どこに負荷要因があるかというと、

  • 1度のページ閲覧(PV)あたりの発行クエリ数が多く、平均的に数百クエリ/PVが発行される
    • SEOの歴史的背景より、内部リンクそのものが多い
    • 十分な数のリンクを表示できるようにするため、表示されるリンクよりも多くのリンクを候補としている
  • キャッシュの有効期限を長くはできない
    • ページに掲載されるコンテンツ(お店)の数が日々増減するため
  • 対象のページ数が膨大である
    • Rettyまとめページは複数の条件(エリア・カテゴリ・目的など)の組み合わせから成っており、非常に多くのページが存在する
    • 短い有効期限でキャッシュが切れ、その対象が多いのでDBに直接発行されるクエリ量は大きくなる

という状況でした。

サービスはindex作成バッチとWebアプリケーションの2つから構成されていて、

  • バッチ: 日時バッチでindex(RustのHashSet)を生成しS3に保存する
  • Webアプリケーション: S3からindexを読み込み、それをもとに集合演算をするgRPCを提供する

となっています。