「同じ IP アドレスを 世界中の複数の場所で広告する」というネットワークの技。これを Anycast といいます。
普通の通信(Unicast)は「1つの IP = 1つの場所」ですが、Anycast は「1つの IP = 複数の場所」。ネットワーク側が 最も近い場所を勝手に選んでくれます。
仕組み的にはインターネットのルーティングプロトコル(BGP)を使っていて、「私はこのIPを持ってます」を世界中のルーターに知らせている、らしいです。
Unicast (普通): [ User ] ──→ 203.0.113.5 ↓ [ Server 1 つ ] Anycast (これ): ┌→ PoP Tokyo [ User Tokyo ] ──→ 203.0.113.5 └→ PoP NY PoP London PoP Sydney ↑ 同じ IP を世界中で広告 → ネットワーク側が最寄りを選ぶ
障害発生! ┌→ PoP Tokyo [ダウン] [ Tokyo User ] ──→ ↓ 自動迂回 └→ PoP Osaka (代替) ※ ユーザーは何もしてない、URL も変えてない
Serverless は リクエストが来た瞬間に関数を起動する ので、しばらく呼ばれてないと 関数が眠った状態 になります。
その状態で次のリクエストが来ると、まず 関数を起こす(コンテナを準備、コードを読み込む、依存関係をロード) 必要があって、これに時間がかかる。これが Cold Start。
1回起きたあとは 暖まった状態 (Warm) でしばらく残るので、2回目以降は速い。だから「最初だけ遅い」現象が起きる、と理解しました。
[ 初回: Cold Start ] Request → 起動準備 → 実行 → レスポンス ~数百ms〜数秒 ・コンテナの作成 ・コードのダウンロード ・依存関係のロード ・初期化処理 [ 2回目以降: Warm Start ] Request → 実行 → レスポンス ~数ms〜数十ms ※ 暖まった関数を再利用
Serverless: Edge: ┌────────────┐ ┌────────────┐ │ Node.js │ │ V8 Isolate │ │ ├ V8 │ vs │ (軽量サンドボックス)│ │ ├ npm modules│ └────────────┘ │ └ Linux env│ └────────────┘ Cold Start ~5ms Cold Start 数百ms+
そこを解決するのが ISR。普段は CDN のキャッシュを返して速い、でも 裏でこっそり最新版を作って差し替える という仕組み。
例えるなら「お店で前に作った料理(キャッシュ)を出しながら、裏で新しいのを作っている」みたいな。ユーザーは待たない、でも次回には新しいのが届く。
これは stale-while-revalidate というキャッシュ戦略を Vercel が実装したもの。HTTPのキャッシュ仕様にもある考え方らしいです。
[ 1回目のアクセス ] User → 古いキャッシュ → 表示 (速い) ↓ 裏で新版を生成中… ↓ 新版をキャッシュに上書き [ 2回目のアクセス ] User → 新しいキャッシュ → 表示 ※ 誰も待たされない ※ でも徐々に最新版に切り替わる
「60秒に1回は更新して」のように、一定間隔で勝手に再生成する方式。
ニュースサイト、ブログのトップページなど、大体これくらいの頻度で更新したいものに使う。Next.js なら revalidate: 60 みたいに指定。
「CMS で記事が公開されたら更新して」のように、特定のイベントが起きたら再生成する方式。
ヘッドレス CMS との連携で Webhook 経由で叩く。記事公開・商品追加など 更新タイミングが予測できないものに向く。