本文へスキップ

つくるフェーズ

  1. TOP
  2. Web制作
  3. つくるフェーズ
  4. JsonSnapshot設計

JsonSnapshot設計 処理しない構造で、表示速度と安定性を高める

JsonSnapshotは、公開サイト用のデータを事前に生成し、JSONファイルとして保存しておく仕組みです。

表示時にデータベースやAPIへ毎回アクセスするのではなく、あらかじめ生成したJSONを読むことで、負荷を抑えながら表示速度と安定性を高めます。

Flying High Works(FHW)では、アクセス時に「速く処理する」だけでなく、そもそも処理しなくてもよい構造を設計するための手段として扱っています。

JsonSnapshotとは

通常のWebサイトでは、ページを表示するたびにデータベースやAPIへアクセスし、必要な情報を取得します。

しかし、アクセス数が増えたり、検索条件が複雑になったりすると、その都度発生するデータ取得処理が大きな負荷になることがあります。

JsonSnapshotでは、あらかじめ公開に必要なデータを生成しておき、表示時にはJSONファイルを読み込むだけにすることで、データベースやAPIへのアクセス回数を削減します。

なぜJsonSnapshotを作ったのか

JsonSnapshotは、実際の案件での経験から生まれました。

Laravel 6の時代、複雑な検索システムを構築していた際、次のような処理を多用する場面がありました。

  • whereHas
  • リレーション
  • ネストした検索

その時に直面したのが、必要以上にデータベースへアクセスしてしまい、処理速度が低下するN+1問題です。

当初は「データベースの検索処理を速くすること」ばかりを考えていました。
しかし実際に運用を続ける中で、WebサーバーとDBサーバーの物理的な距離も問題になることに気付きました。

データベースの検索が速くても、DBへアクセスし、結果を受け取り、再度DBへアクセスする処理が何十回、何百回と繰り返されれば、その通信そのものが時間を消費します。

そこで考えたのが、毎回データベースへ問い合わせるのではなく、公開用のデータを事前生成できないか、という発想です。

JsonSnapshotの仕組み

通常のWebサイトでは、WebサーバーからDBへアクセスし、データを取得して画面を表示します。

一方でJsonSnapshotでは、管理画面で情報を更新したタイミングや、必要なバッチ処理のタイミングでJSONを生成し、公開時はそのJSONを読むだけにします。

  • DBから公開用データを生成する
  • 生成したJSONを保存する
  • WebサーバーはJSONを読み込んで表示する

そのため、DB負荷やAPI負荷を大幅に削減できます。

キャッシュとの違い

キャッシュも表示速度向上に有効な仕組みです。

しかしキャッシュは、一度生成された結果を再利用する考え方です。
一方でJsonSnapshotは、管理画面で情報を更新したタイミングなどに、公開用データそのものを事前生成する仕組みです。

そのため、DBへアクセスしない、APIへアクセスしない、毎回同じ処理をしない、という状態を作ることができます。

SSRとの違い

JsonSnapshotは、SSR(Server Side Rendering)と似た考え方に見えるかもしれません。

SSRはアクセスのたびに処理を実行します。
一方でJsonSnapshotは、管理画面で更新されたタイミングなどで公開用データを事前生成します。

そのため、アクセス時にはJSONを読み込むだけで済み、アクセス数が増えた場合でも処理量が増えにくいという特徴があります。

リクエスト時に最新状態を反映しやすいという意味ではSSRの方が柔軟ですが、アクセス時の処理量を抑え、表示速度や安定性を高めるという意味ではJsonSnapshotが有利になるケースもあります。

路線・駅検索との相性

JsonSnapshotが特に効果を発揮するのは、検索条件が多いサイトです。

  • 不動産サイト
  • 求人サイト
  • 店舗検索サイト
  • 施設検索サイト

路線一覧や駅一覧で、山手線(120件)、中央線(84件)、新宿駅(38件)、渋谷駅(27件)のような件数表示を行うケースがあります。

これを毎回データベースで集計すると、アクセス数が増えるほど負荷が高くなります。
JsonSnapshotでは、事前に件数を集計してJSON化しておくことで、軽量かつ高速に表示できます。

向いているデータ

JsonSnapshotは、更新頻度が低く、参照頻度が高いデータと相性が良いです。

  • 都道府県一覧
  • エリア一覧
  • 路線一覧
  • 駅一覧
  • サイト全体の件数集計
  • 人気ランキング
  • サマリー情報
  • 検索条件マスタ

一方で、在庫数、ログイン状態、決済情報など、リアルタイム性が必要な情報には向いていません。
そうした情報は、通常のDBアクセスやAPI連携が必要になります。

JsonSnapshotのメリット

  1. DB負荷を軽減できる
    データベースへのアクセス回数を削減できます。
  2. API負荷を軽減できる
    外部サービスとの通信回数を減らせます。
  3. 表示速度を向上できる
    JSONファイルを読むだけなので高速です。
  4. 障害耐性が向上する
    DBやAPIに問題が発生しても、生成済みデータを利用できます。
  5. スケールしやすい
    アクセス数が増えても影響を受けにくくなります。

Flying High Worksの考え方

私たちは、表示速度の問題をサーバースペックだけで解決しようとは考えていません。

サーバーを強化すれば改善するケースもあります。
しかし、DBアクセス回数、APIアクセス回数、通信回数そのものを減らした方が効果的なケースもあります。

JsonSnapshotは、その考え方から生まれました。
私たちは、「どのように速くするか」ではなく、「そもそも処理しなくてもよい構造にできないか」を考えながら設計しています。