###本項はLumen Edge Application DeliveryでのVarnishについての記述です
https://lumen-28.hubspotpagebuilder.com/lumen-technologies-japan/lumen-edge-cloud-app-delivery
#リクエストのアグリゲーション(リクエストコラプシング/Request Collapsing)
リクエストコラプシング/Request Collapsingとは、同じオブジェクトに対する複数のリクエストを保留し1つのオリジンリクエストにまとめ、レスポンス結果を使用して保留中のすべてのリクエストに対して返答を行う機能です。
これにより、キャッシュ内の人気コンテンツオブジェクトの有効期限が切れた場合に、オリジンサーバーへの複数リクエストが殺到し、オリジン側のサーバリソースを消費するのを防ぎます。トラフィックが多いサービスの場合、リクエストコラプシング(Request Collapsing)を正しく使用すると、オリジンサーバーへのトラフィックが減少して負荷の軽減になります。
キャッシュミス(初回リクエスト及びキャッシュ期限切れ)の場合は、Varnishにてデフォルトでリクエストコラプシング(Request Collapsing)される可能性があります。
Varnish VCLでは、キャッシュ応答のために、vcl_fetchでreturn(pass)が見つかった場合、hit-for-passオブジェクトが作成され、キャッシュに挿入されます。この場合、その後のユーザからの複数リクエストは保留リストに一旦待ち状態とされて個別に処理されます。
これらの動きは以下になります:
ステータス | Collapses機能の発動 | 詳細 | VCL処理 |
---|---|---|---|
Default miss | Y | 通常のキャッシュミスの場合でかつキャッシュ可能なコンテンツの場合、リクエストはコラプスされ、一番最初のユーザリクエストを待って、オリジンからのレスポンスを持って保留リクエストすべてに回答されます。(Cookie等を利用した特定ユーザセッションに対するプライベートコンテンツなど注意が必要です) | vcl_recv: lookup ➔ vcl_miss: fetch ➔ vcl_fetch: deliver ➔ * |
Uncacheable response | Y | とあるリクエストがキャッシュミスの場合で、オリジンからキャッシュしないコンテンツである回答があった場合、一旦コラプスされたリクエストでの一番最初のリクエストにのみ当該レスポンスを返却し、他の保留リクエストに於いても順に個別のリクエストとしてオリジン側に接続を行います。 | vcl_recv: lookup ➔ vcl_miss: fetch ➔ vcl_fetch: deliver ➔ * |
Pass on response VCL | Y | VCL設定によりreturn(pass)透過バイパス設定がvcl_fetch内にキャッシュ可能なコンテンツに指定されている場合、一旦コラプスされたリクエストでの一番最初のリクエストにのみ当該レスポンスを返却し、hit-for-passオブジェクトと認識されたのちは、他のリクエストに於いて以降新たな保留キューは作成せず順に個別のリクエストとしてオリジン側に接続を行います→次項のHit for Passに続く | vcl_recv: lookup ➔ vcl_miss: fetch ➔ vcl_fetch: pass ➔ * |
Hit for pass | N | とあるコンテンツに対するリクエストにて、当該コンテンツが既にhit-for-pass指定されていた場合他のリクエストに於いて以降新たな保留キューは作成せず順に個別のリクエストとしてオリジン側に接続を行います。 | vcl_recv: lookup ➔ vcl_pass: fetch ➔ vcl_fetch: * |
Pass on request | N | vcl_recv内でreturn(pass)透過バイパス設定がされている場合は、当該コンテンツはキャッシュせずコラプシングも発動しません | vcl_recv: pass ➔ * |
req.hash_ignore_busy | N | vcl_recv内でreq.hash_ignore_busyをTrue設定にした場合コラプシングは動作しません。 | All |
# Disable request collapsing
set req.hash_ignore_busy = true;
参考:VCL処理フロー
https://qiita.com/yoshitaka_nakahara/items/316dd9ac221d6a859f66
###キャッシュしないコンテンツとは
下記の通りCache-Controlに**”Private”**と記述されているものだけが対象となる点要注意です。max-age:0やno-cacheはVarnishではキャッシュNGとみなしません。この場合でキャッシュさせたくない、若しくはコラプシングを発動させたくない場合は明示的にPASS設定をする等の対処が必要です。
Cache-Control: private