ボタンを押してから、画面が返ってくるまで

概要 — まず全体をつかむ

初級・中級では「1リクエスト=HTTPのやり取り」を全体像として見ました。上級では、その1往復を受けもつシステムの各層(フロント・バック・データ・インフラ)を開け、規模が大きくなったときに何が起きるか——キャッシュ階層・非同期・水平スケール・障害の伝播——まで踏み込みます。ここはシステム構成の深掘りを担当します。

一方で、通信経路そのもの(DNS→TCP→TLS→HTTPの積み重ねや、HTTP/1.1→2→3の世代差)の詳細は URLを打ってから表示されるまで 上級に委ねます。この記事では「経路」ではなく「構成」を掘ります。

詳細 — 1段階ずつ追う

システムを層で見る

アニメーション『1リクエストの流れ(全体図)』を開く
ネットワーク(すべてを載せて・つなぐ土台)🔒 セキュリティオリジン(自分のサーバ群)を守るエッジ=利用者の近く無ければオリジンへ端末(ブラウザ)=フロントCDNエッジ世界中に分散・近い入口(LB/WAF)振り分け・門番フロントサーバ画面配信・SSRバックエンドサーバAPI・処理DBサーバ構造データキャッシュRedis等・高速ストレージサーバ画像・ファイル各ノードをクリックすると、その解説へ移動します

1リクエストは、責務の違う4つの層を通り抜けます。層で分けて考えると、障害の切り分けもスケールの設計も一気に見通せます。

  • インフラ層(入口) — ロードバランサ・WAF・リバースプロキシ。振り分け・防御・死活監視
  • フロント層 — 画面(HTML/静的資産)の生成と配信
  • バック層(API) — 認証・認可と業務ロジック。「何を返すか」の判断
  • データ層 — DB・キャッシュ・ストレージ。事実の保管と取り出し

各層は「上の層は下の層の中身を知らなくてよい」ように責務の境界で仕切られています。だから1つの層だけを増強・交換できます。

やさしく言うと(中級
アニメーション『1リクエストの流れ(全体図)』を開く
ネットワーク(すべてを載せて・つなぐ土台)🔒 セキュリティオリジン(自分のサーバ群)を守るエッジ=利用者の近く無ければオリジンへ端末(ブラウザ)=フロントCDNエッジ世界中に分散・近い入口(LB/WAF)振り分け・門番フロントサーバ画面配信・SSRバックエンドサーバAPI・処理DBサーバ構造データキャッシュRedis等・高速ストレージサーバ画像・ファイル各ノードをクリックすると、その解説へ移動します

1リクエストとは、HTTPリクエストを送り、HTTPレスポンスを受け取る1往復のこと。図の各ノードは、この往復の「どの区間」を担うかを表します。左のブラウザが起点、右のデータ層が終点です。

各層の責務と深掘り

上から順に、それぞれの層で何が起きているかと、深掘り先を示します。

  1. インフラ層 — 入口のロードバランサが空いているサーバへ分散し、ヘルスチェックで異常な台を外す。これが後述の水平スケールの前提になる(→ ロードバランサ)。前段のWAFがアプリ層の攻撃を弾く
  2. フロント層 — 静的配信か、SSR(サーバ側でHTMLを組み立てる)か、CSR(ブラウザ側で組む)かを選ぶ。初期表示速度とSEOに直結する(→ フロントサーバ
  3. バック層 — APIの窓口で認証(誰か)・認可(何をしてよいか)を確かめ、業務ロジックを実行する。サーバを増やせるよう状態を持たない(ステートレス)設計が要(→ APIバックエンドサーバ
  4. データ層 — DBはインデックスで探索を速め、読み取りが増えればレプリケーションで読み書きを分離する(→ DBサーバ)。よく読む答えは手前のキャッシュで受ける(→ キャッシュ)。大きな塊はストレージから直接配る

各機械の内部は上のリンク先で深掘りします。ここで押さえたいのは、どの層に何の責務があり、どこが増やせて、どこが詰まりやすいかという全体の骨格です。

やさしく言うと(中級
  1. 名前解決(DNS ※1)example.com のような名前を、実際の宛先(IPアドレス)に変換する
  2. 接続(TCP+TLS ※2) — 相手と通信路を確立し、HTTPSなら暗号化の鍵を交換する
  3. HTTPリクエスト送信(※3) — メソッド(GET・POSTなど)+パス+ヘッダ(+ボディ)を送る
  4. 静的は CDN(※4) — エッジがキャッシュを持てば即レスポンス(cache hit)。無ければオリジンへ取りに行く(miss)
  5. 入口(LB/リバースプロキシ/WAF ※5) — 空いているサーバへ振り分け、死活監視し、不正リクエストを遮断する
  6. フロント(※6) — 静的配信、または SSR で初期HTMLを生成。以降の中身はAPI経由で取得する
  7. API →バックエンド(※7) — REST/JSON などの形で要求。認証(誰か)・認可(何ができるか)を確認し、業務ロジックを実行する
  8. データ層 — DB(※8・SQLで問い合わせ)/キャッシュ(※9・hitでDB回避)/ストレージ(※10・大きな塊を配信)
  9. HTTPレスポンス(※11) — ステータスコード+ヘッダ+ボディを返す。逆順で戻り、ブラウザが描画する

登場人物メモ(※の説明):

  • ※1 DNS — ドメイン名→IPアドレスの電話帳。最初の一手
  • ※2 TCP/TLS — 順序と到達を保証する通信路(TCP)+暗号化(TLS)。HTTPSは「HTTP over TLS」
  • ※3 HTTPリクエスト — メソッド・パス・ヘッダ・ボディの4点セット
  • ※4 CDN — エッジのキャッシュ。TTLで鮮度を管理し、cache hit/miss で振る舞いが変わる
  • ※5 入口 — ロードバランサ(振り分け・ヘルスチェック)/リバースプロキシ/WAF(アプリ層の防御)
  • ※6 フロント — 静的配信か SSR(サーバ側でHTMLを組み立てる)か
  • ※7 API/バック — REST・GraphQL などの窓口。認証と認可を確認してから処理
  • ※8 DB — SQLで構造データに問い合わせ。インデックスで探索を速くする
  • ※9 キャッシュ — Redis など。読み取りの多い答えを載せる。難所は「無効化(いつ捨てるか)」
  • ※10 ストレージ — オブジェクトストレージ。大きなファイルは署名付きURLで直接配ることも
  • ※11 レスポンス — ステータスコード+ヘッダ+ボディ

規模に耐える工夫

利用者が増えても倒れないための、システム側の3本柱です。

  • キャッシュ階層 — 速さは「どれだけ手前で答えを返せるか」で決まる。CDNエッジ → 共有キャッシュ(Redis等) → DB内のバッファと、手前ほど速く安い。難所は無効化——いつ古い答え(stale)を捨てるか。手前に置くほど鮮度管理が難しくなる(→ キャッシュCDN
  • 非同期(キュー・ジョブ) — メール送信・集計・画像変換など重い処理は、レスポンスと切り離してキューに積み、後でジョブとして実行する。利用者は待たされず、突発的な負荷はキューが吸収する(→ 非同期処理
  • 水平スケール — サーバ1台を強くする(垂直)のではなく、同じ役割の台を並べて入口で分散する。前提は各サーバがステートレスであること——状態を持たないから、どの台に振られても同じ結果になり、増減が自由になる

この3つはいずれも「1本道を太くする」のではなく「道を増やす/手前で折り返す/後回しにする」という発想です。

やさしく言うと(中級
  • CDN — エッジキャッシュで静的配信をオリジンから剥がす。効果は cache hit 率で決まる
  • キャッシュ(Redis等) — 読み取りの重い答えを手元に。整合性(古いデータ=stale)と無効化がトレードオフ
  • ロードバランサ — ラウンドロビン等で分散し、ヘルスチェックで異常サーバを外す。水平スケールの前提
  • 非同期(キュー・ジョブ) — 重い処理はレスポンスと切り離し、後でジョブとして実行(メール送信・集計など)

⚠️ 障害はこう伝播する

規模が大きい系では、1点の不調が連鎖して広がります。層で考えると連鎖の断ち方が見えます。

  • カスケード障害 — 遅い依存先で滞留したリクエストがスレッド・接続プールを食い潰し、入口を共有する無関係な機能まで巻き込む。タイムアウト・サーキットブレーカ・隔離(bulkhead)で連鎖を断つ
  • リトライストーム — 障害時の一斉再送がさらに負荷を積み増す。指数バックオフと、二重実行を防ぐ冪等性の設計で抑える
  • 単一障害点(SPOF) — 1台落ちれば全体が止まる箇所。DBやLB自身を冗長化して消す
  • キャッシュ雪崩 — 多数のキャッシュが同時に期限切れし、負荷がDBへ殺到する。期限をばらす・鍵ごとに再生成を1本に絞るなどで防ぐ
  • 層をまたぐ切り分け — 「遅い/落ちた」がどの層で起きたかを、まず入口・フロント・バック・データのどこかに当てるのが調査の第一歩。ネットワーク経路側の切り分けは URLを打ってから表示されるまで を参照
やさしく言うと(中級

ステータスコードは「どの層で・何が起きたか」を読む手がかりです。

  • 2xx 成功 — 200 OK など
  • 3xx リダイレクト — 301(恒久)・302(一時)
  • 4xx 依頼側の問題 — 400(不正)・401(未認証)・403(権限なし)・404(無い)・429(出しすぎ)
  • 5xx 応答側の問題 — 500(内部エラー)・502(不正ゲートウェイ)・503(混雑)・504(タイムアウト)

遅いときのリトライ(再送)は、処理が二重に走らないか——冪等性(同じ操作を何度やっても結果が同じか)に注意します。

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. 「カスケード障害(障害の伝播)」の説明として最も近いのは?

2. 同じ役割のサーバを増やして負荷を捌く「水平スケール」を成り立たせる、バックエンド設計の前提に最も近いのは?

3. TLS 1.3 のハンドシェイクが 1.2 より速くなった主因に近いのは?

4. HTTP/3 が土台にする輸送プロトコルは?

5. キャッシュ階層(CDNエッジ→共有キャッシュ→DBバッファ)について正しいのは?

6. 障害時に一斉再送が積み重なって負荷を増やす「リトライストーム」を抑える組み合わせはどれ?

7. 読み取りが増えたDBで、読み書きを分けて負荷を逃がす仕組みはどれ?

8. カスケード障害の連鎖を断つ定石として挙げられるのはどれ?

9. 1台落ちれば全体が止まる箇所を「単一障害点」と呼ぶ。この英語頭字語(4文字)は?

10. 多数のキャッシュが同時に期限切れし、負荷がDBへ一気に殺到する現象を「キャッシュ◯◯」と呼ぶ。◯◯は?