CDNとレイテンシ低減の最適化
1)目標と遅延マップ
レイテンシー=DNS+TCP/TLS+TTFB(サーバー/オリジン/キャッシュ)+コンテンツ配信(RTT ×ボリューム)+クライアントレンダリング。
最適化=RTTの数を減らし、バイト数を減らし、計算/キャッシュをユーザーに近づけます。
2) CDNアーキテクチャ
Anycast POPは、ニアエンドのBGPルーティングノードです。
階層型キャッシュ/起源シールド-起源のミス嵐を軽減する「傘」中間層。
地理/地域ルーティング-テナント/管轄の拘束力(データ主権、ライセンス)。
フェイルオーバー-バックアップ元/地域、健康サンプル、および高速スイッチ。
3)キャッシュ: キー、ヘッダー、戦略
3.1キャッシュキー
デフォルトは'scheme+host+path+?query'。
必要なパラメータだけを追加します('?v='、'?lang='、'?テナント=')。残りはignore-paramsです。
'Vary'-最小:'Accept-Encoding'、 'Accept-Language'(必要に応じて)、'Authorization'はキャッシュを壊します。
3.2ポリシー
Public statics: 'Cache-Control: public、 max-age=31536000、 immutable'+rev(名前のハッシュ)。
ハーフダイナミクス(ディレクトリ、ルール、FAQ): 's-maxage=300、 stale-while-revalidate=600、 stale-if-error=86400'。
API-GET: ETag/Last-Modified、 'SWR/SIE'を使用して、結合を有効にします(ホットキーの1つのリクエスト)。
プライベート:個人的な応答-エッジコンピューティング(ESI/kv)またはテナントキャッシュごとに周囲に。
3.3アンチストーム
Request coalescing-同時ミスリクエストを折りたたみます。
Serve-stale-原点が失敗したときに古いオブジェクトを与えます。
バックグラウンドの再検討-バックグラウンドで更新。
4) HTTP/2-3、 TCP/TLSおよび早期リターン
HTTP/2: multiplexのヘッダー圧縮;'max concurrent stream'、大きなヘッダを制限します。
HTTP/3 (QUIC):モバイル/ハイロスTTFBの大幅な減少。Initial-rapidsとRetryに注目してください。
TLS 1。3: 1-RTT握手;OCSPのステープル;HSTS。
0-RTT: idempotent 'GET'とリプレイリスクが考慮されている場合のみ。
103初期ヒント:重要なリソースの初期'Link: rel=preload'。
Preconnect/DNS-prefetch: '<link rel="preconnect" href="https ://cdn。例「>」。
5)エッジコンピューティングと「ファインパーソナライゼーション」
エッジ:タイトルの国勢調査、地理/テナントの固定、A/Bマーキング、起源を求めることなく簡単にパーソナライゼーション。
ルール:POPノードにPIIを保存しないでください。キャッシュアグリゲート/パブリックデータのみ。
6)メディアとフォーマットの最適化
画像:WebP/AVIFへの自動変換、エッジのサイズ変更、'srcset/sizes'、 'lazyload'。
圧縮:テキスト用のBrotli (HTML/CSS/JS/JSON)、 gzipフォールバック。
ビデオ:HLS/DASH、 CDNセグメントキャッシュ、'preload=metadata'、ポスター。
フォント:subset+'font-display: swap';長いキャッシュを持つホスト。
重要なCSS:インライン最初の画面;残りは非同期です。
7) APIパターンとキャッシュ
Idempotent GET-リクエストキー(データバージョンを含む)でキャッシュします。
ETag:強力なペイロードhash+'If-None-Match'。
「キャッシュコントロール」クライアントと区別するためのサロゲートコントロール(CDN固有)。
署名されたURL-プライベート静的/メディア用。
GraphQL:操作/変数によってキーキャッシュを正規化します。部分キャッシュ/リゾルバーキャッシュを使用します。
WebSockets:リアルタイムの場合-メッセージの短縮、圧縮(permessage-deflate)、 WSシャードの位置をユーザーに近づけます。
8)構成例
8.1 NGINX (origin: we cache API-GET)
nginx
We give SWR and ETag location/api/v1/catalog/{
proxy_cache api_cache;
proxy_cache_key "$scheme$request_method$host$uri$is_args$args";
proxy_cache_valid 200 5m;
proxy_cache_use_stale updating error timeout http_500 http_502 http_503 http_504;
add_header Cache-Control "public, s-maxage=300, stale-while-revalidate=600, stale-if-error=86400";
add_header ETag $upstream_http_etag;
proxy_ignore_headers Set-Cookie; # do not break the Set-Cookie proxy_hide_header cache;
proxy_pass http://catalog;
}
8.2 Fastly VCL (SWR、合体、クッキー無視)
vcl sub vcl_recv {
set req. hash_ignore_busy = true; # coalescing if (req. url. qs ~ "^(?!.(lang v)=)") { remove req. url. qs; }
if (req. http. Cookie) { remove req. http. Cookie; }
}
sub vcl_backend_response {
set beresp. ttl = 300s;
set beresp. stale_if_error = 86400s;
set beresp. stale_while_revalidate = 600s;
if (beresp. http. Set-Cookie) { unset beresp. http. Set-Cookie; }
}
8.3 Cloudflare(トランスフォームルール、キャッシュルール、初期のヒント------)
json
{
"cache_rule": {
"if": "http. request. uri. path matches \"/assets/.\"",
"action": {"cache": {"eligibility":"eligible", "ttl": 31536000}}
},
"transform_rule": {
"set_headers": [{"name":"Cache-Control","value":"public, s-maxage=300, stale-while-revalidate=600"}]
},
"early_hints": {"enable": true}
}
9)モバイルネットワークと「不安定」インターネット
積極的にHTTP/3を使用します。クリティカルパスのサイズを小さくします(HTML+クリティカルCSS <14 KB)。
優先H2/H3:優先順位付け(後でHTML→CSS→JS→メディア)。
jitterを使用したポリシーの再試行、APIのためのidempotency。
サイズ予算とバンドル:コード分割、遅延JS、未使用のCSS/JSを削除します。
10)観察可能性およびSLO
RUM: 地域/ASN/テナントによるTTFB、 LCP、 INP、 CLS;p95/p99ディストリビューション。
合成:POP-sによる制御ルート「/health/cdn「。
キャッシュメトリック:全体とキーごとのヒット率;起源のフェッチ率;貯蓄を結合します。
アラート:ヒット比ドロップ、オリジン出力の増加、H3-fraction劣化、シールドあたり5xx。
11) iGaming/Financeの詳細
ゲームカタログ/オッズ: ショート's-maxage'+SWR;region-aware ключ ('tenant' region 'lang')
イベントピーク(マッチ、描画):キャッシュのウォーミング(プリウォーム)、重いパーソナライゼーションの「凍結」、ミラーソース。
Payment/Cabinet:非公開ではなく、H3+edge-TLSとclose regionを介して加速します。
管轄区域:地域ごとの分割ドメイン/パス;'Vary: X-Region'コントロール。
12) Antipatterns
'Vary:'すべてに;キャッシュキーは不要なCookie/ヘッダーによって異なります。
短い起源の失敗のためのSWR/SIE→の黒いスクリーンの欠如。
タグ/キーでポイント障害の代わりにキャッシュを「全体」クリアします。
nameリビジョンがなく'max-age=0'のリソース。
publicが与えられていても'Authorization'のグローバルdeny-cache。
合体→起源の嵐の欠如。
POP上の早期の「重い」パーソナライゼーション。
13) Prod Readinessチェックリスト
- Anycast POP+階層型/シールド;ヘルスチェックとオリジンフェイルオーバー。
- キャッシュキーは最小です。不要なクエリ/クッキーを無視します。「サロゲートコントロール」。
- SWR/SIEが有効になり、アクティブに結合します。エラーのserve-stale。
- HTTP/3が有効になっています。TLS 1。3;103初期ヒントは重要なリソースに設定されています。
- 画像:AVIF/WebP、リサイズオンエッジ;歌詞のためのブロトリ。
- API-GET-ETag/Last-Modified;idempotency/retreats;プライベートプロファイルをキャッシュしないでください。
- 静的ドメインへの事前接続;critical CSSインライン。
- メトリクス:ヒット率、origin-egress、 TTFB/LCP p95、 H3-share、地域別/テナント別。
- イベント前にウォームアッププランをキャッシュする。ポイント障害(タグ)。
- /keys/TTLドキュメントを変更します。インシデントのプレイブック(ヒット率ドロップ)。
14) TL;DR(ドクター)
階層型/シールド+適切なキャッシュキー+SWR/SIE+合体。HTTP/3/TLS 1をオンにします。3、103の初期ヒントと事前接続を使用します。エッジ、インラインクリティカルCSSでメディアを圧縮して変換します。API-ETagの場合、きちんとした'Vary'、 idempotency、そして合理的なキャッシュ'GET'。ヒット比、TTFB/LCP p95、オリジンエグレスを測定し、ピーク時にキャッシュを事前にウォームアップします。