Varnish Grace Mode非同期キャッシュ更新


本項はLumen Edge Application DeliveryでのVarnishについての記述です

Grace Modeとは

キャッシュ有効期間(TTLで設定された期間)が過ぎた場合に置いても、 grace期間はキャッシュからレスポンスを返し、バックグラウンドでフェッチし、キャッシュオブジェクトを更新します。

これにより、クライアントにはなるべくキャッシュからレスポンスを返すとともに、キャッシュのオブジェクトを最新化できます。

vcl
sub vcl_backend_response {
  set beresp.ttl = 30s;
  set beresp.grace = 30s;
}

Grace mode

複数のクライアントが同じページを要求している場合、Varnishは1つの要求をバックエンドに送信し、バックエンドから1つのリクエストをフェッチしている間他のユーザからの要求を保留にします。これはリクエストのアグリゲーションとしてRequest CoalescingまたはRequest Collapsingと呼ばれ、Varnishはこれを自動的に行います。

例えば1秒あたり数千ものリクエストを処理している場合、待機中のリクエストのキューが膨大になる可能性があります。ここには2つの潜在的な問題があります-1つ目はRequest Collapsingで最終的にフェッチしたコンテンツを、キューに待たせたユーザに一気にレスポンスするためサーバ負荷が高くなる可能性があります。2つ目にそもそも待機キューとなってしまう事での遅延が発生する可能性もあります。

そこでGrace modeを設定する事で、VarnishはコンテンツTTLの期限が切れた後しばらくの間、既存キャッシュしたオブジェクトをクライアントに提供しつつオブジェクトの新しいバージョンをオリジンサーバよりフェッチします。デフォルト値は、パラメータdefault_graceによって制御されます。

Keep

オブジェクトに対してKeep設定すると、Varnishはオブジェクトをキャッシュに保持しつつ、更新確認条件付きのGETバックエンドリクエストを作成します(If-Modified-Since:および/またはÌf-None-Match:ヘッダーを使用)、この場合バックエンドでのオリジンサーバが304 Not Modified(コンテンツ更新無し)を応答をレスポンス返却した場合は、再度コンテンツBODYを取得することなく既存のキャッシュ済コンテンツを利用します。

上記のGraceとKeepを併用する場合はキャッシュTTLは両機能の加算値になります。

vcl
sub vcl_backend_response {
     set beresp.grace = 2m;
     set beresp.keep = 8m;
}

上記の場合、合計のTTL値は10Munitesになります。

5XX時のGrace mode