Happy Web Engineer
Last updated on

システム設計の基礎入門|スケーリングやキャッシュをやさしく図解で理解


はじめに

エンジニアとして仕事をしていると、必ず耳にするのが 「システム設計」 という言葉です。
コードが書けるようになった初心者から中級者へのステップアップとして、多くの人がつまずくポイントでもあります。

「設計ってアーキテクチャの図を描く難しい仕事でしょ?」と感じる方も多いかもしれません。
ですが実は、システム設計の考え方は私たちの日常生活にとても近いものです。

  • 人気カフェが混雑したら席を増やす(スケーリング)
  • カレーをまとめて作り置きしておく(キャッシュ)

この記事では、このような身近な例えを交えながら、システム設計の基本である スケーリングキャッシュ についてやさしく解説します。
さらに、クラウド環境での活用方法や、Laravel・Node.js などでの実践例も紹介していきます。


システム設計とは?

システム設計とは、アプリケーションを 「どう作るか」 だけでなく、「どう動かし続けるか」 を考えることです。

小規模なアプリなら1台のサーバーでも十分動きます。
しかしユーザーが増えると「ページが表示されない」「処理が遅い」といった問題が発生します。

そこで必要になるのが、負荷に耐えられるようにする工夫(スケーリング)効率を上げる仕組み(キャッシュ) です。


スケーリングとは?

レストランの席を増やすイメージ

  • 小さなカフェに最初は4席しかないとしましょう。
  • 人気が出てお客さんが押し寄せると、待ち時間が発生します。
  • そこで「席を増やす」「2号店を出す」といった工夫をするのが スケーリング です。

システムでも同じで、ユーザーやトラフィックに応じて処理能力を増やすことを「スケーリング」と呼びます。

スケーリングの種類

  1. 垂直スケーリング(スケールアップ)
    • 1台のサーバーの性能を上げる(CPU・メモリを追加)。
    • 短期的には有効ですが、上限があります。
  2. 水平スケーリング(スケールアウト)
    • サーバーを複数台に増やし、負荷を分散させる。
    • クラウド環境や Docker / Kubernetes では一般的です。

キャッシュとは?

冷蔵庫の作り置きイメージ

  • カレーを毎回一から作るのは大変。
  • 一度にたくさん作って冷蔵庫に入れておけば、次は温めるだけですぐ食べられます。
  • この「作り置き」が キャッシュ にあたります。

システムでも同じで、よく使うデータを保存しておき、次回以降の処理を速くするのがキャッシュです。

キャッシュの種類

  1. ブラウザキャッシュ
    • ユーザーの端末に画像やCSSを保存し、再読み込みを速くする。
  2. アプリケーションキャッシュ
    • サーバー側でデータベース検索結果を保存し、再利用する。
  3. CDNキャッシュ
    • 世界中のサーバーにコンテンツを分散し、近い場所から配信する。

キャッシュの落とし穴に注意!

キャッシュは便利な仕組みですが、万能ではありません。使い方を間違えると、逆にトラブルの原因になることがあります。

1. 古いデータが残ってしまう

  • 例えば「商品が売り切れたのに、キャッシュに残ったまま表示されて注文できてしまう」ケースがあります。
  • これは キャッシュの有効期限(TTL: Time To Live) を適切に設定していないことが原因です。

👉 対策:キャッシュの寿命を短めにする、在庫更新時にはキャッシュを強制的にクリアする仕組みを導入する。


2. キャッシュが効きすぎてバグに気づかない

  • 「昨日のデータがそのまま表示されるから、バグに気づけなかった」というケースもあります。
  • 開発中やテスト環境ではキャッシュを無効にして、常に最新データを確認できるようにしておくことが大切です。

3. キャッシュの更新タイミングが難しい

  • ニュースサイトやSNSのように「最新の情報をすぐに反映させたい」サービスでは、キャッシュが邪魔になることもあります。
  • この場合、記事一覧はキャッシュするけれど、記事投稿やコメント部分はキャッシュしない、など部分的に切り分ける必要があります。

4. キャッシュの容量オーバー

  • キャッシュにも保存容量の限界があります。保存しすぎると古いデータが強制的に削除され、逆にパフォーマンスが落ちることがあります。
  • 特に Redis や Memcached などのキャッシュサーバーでは、容量設計をしっかり考える必要があります。

スケーリングとキャッシュを組み合わせる

現実のシステムでは、スケーリングとキャッシュを組み合わせることで効率と安定性を両立 します。

例:ECサイトのセール時

  • サーバーをスケールアウトしてアクセス急増に備える。
  • 商品一覧や画像はキャッシュで高速表示する。

これにより「落ちない・速い・安定している」サイト運営が可能になります。


実践的な例:Laravelでのキャッシュ

use Illuminate\Support\Facades\Cache;

$users = Cache::remember('users', 60, function () {
    return DB::table('users')->get();
});
  • 最初のアクセスでDBから取得し、キャッシュに保存。
  • その後60分間はキャッシュを利用し、高速化。

実践的な例:Node.jsでのキャッシュ

const NodeCache = require("node-cache");
const myCache = new NodeCache({ stdTTL: 60 });

function getUserData() {
  let value = myCache.get("users");
  if (value == undefined) {
    value = fetchUsersFromDB();
    myCache.set("users", value);
  }
  return value;
}

これで毎回DBにアクセスせず、キャッシュ済みのデータを使えます。


クラウド環境でのスケーリング

AWS / GCP / Azure などのクラウドでは、スケーリングを自動化できます。

  • AWS Auto Scaling:負荷に応じてEC2インスタンスを自動増減。
  • GCP GKE(Kubernetes):Pod数を自動調整。
  • Azure VM Scale Sets:仮想マシンの数を自動スケーリング。

図解でイメージ

利用者 → [ロードバランサー] → [Webサーバー群] → [DBサーバー]
                          ↓
                       [キャッシュサーバー]
  • ロードバランサーがリクエストを分散
  • Webサーバーが処理を担当
  • データベースにアクセスする前にキャッシュを確認

初心者が意識すべきこと

  1. キャッシュは「どこに置くか」が重要
  2. スケーリングは「どこがボトルネックか」を見極めることから
  3. 設計は「ボトルネックを解決する工夫」

まとめ

システム設計は難しそうに感じますが、日常生活の工夫に例えると理解しやすくなります。

  • スケーリングは「席を増やす」
  • キャッシュは「作り置きする」
  • ただしキャッシュには落とし穴もあるので、TTLや更新方法をきちんと設計することが大切

この考え方を理解するだけで、システムが「なぜ速くなるのか」「なぜ安定するのか」が直感的にわかるようになります。


関連記事

👉 Dockerを使った開発環境構築の基本ステップ|初心者から始めるコンテナ開発入門
👉 Laravel Sail入門|開発環境をシンプルに整える基本ステップ
👉 Node.js・Deno・Bunって何が違うの?初心者にもわかる基礎比較と選び方
👉 はじめてのDocker Compose|誰でもできる開発環境の作り方