Cache Invalidation

"There are only two hard things in Computer Science: cache invalidation and naming things." -- Phil Karlton

「コンピュータ サイエンスで難しいことは 2 つしかありません。キャッシュの無効化と名前付けです。」 -- フィル・カールトン

Once a URL is cached by a gateway cache, the cache will not ask the application for that content anymore. This allows the cache to provide fast responses and reduces the load on your application. However, you risk delivering outdated content. A way out of this dilemma is to use long cache lifetimes, but to actively notify the gateway cache when content changes. Reverse proxies usually provide a channel to receive such notifications, typically through special HTTP requests.

URL がゲートウェイ キャッシュによってキャッシュされると、キャッシュはアプリケーションにそのコンテンツを要求しなくなります。これにより、キャッシュの応答が速くなり、アプリケーションの負荷が軽減されます。ただし、古いコンテンツを配信するリスクがあります。このジレンマから抜け出す方法は、長いキャッシュの有効期間を使用することですが、コンテンツが変更されたときにゲートウェイ キャッシュに積極的に通知することです。通常、リバース プロキシは、通常、特別な HTTP 要求を通じて、そのような通知を受信するためのチャネルを提供します。

Caution

注意

While cache invalidation is powerful, avoid it when possible. If you fail to invalidate something, outdated caches will be served for a potentially long time. Instead, use short cache lifetimes or use the validation model, and adjust your controllers to perform efficient validation checks as explained in HTTP Cache Validation.

キャッシュの無効化は強力ですが、可能な限り避けてください。何かを無効にしないと、古いキャッシュが長時間提供される可能性があります。代わりに、短いキャッシュの有効期間を使用するか、検証モデルを使用し、コントローラーを調整して、HTTP キャッシュの検証で説明されているように効率的な検証チェックを実行します。

Furthermore, since invalidation is a topic specific to each type of reverse proxy, using this concept will tie you to a specific reverse proxy or need additional efforts to support different proxies.

さらに、無効化は各タイプのリバース プロキシに固有のトピックであるため、この概念を使用すると、特定のリバース プロキシに関連付けられるか、別のプロキシをサポートするために追加の作業が必要になります。

Sometimes, however, you need that extra performance you can get when explicitly invalidating. For invalidation, your application needs to detect when content changes and tell the cache to remove the URLs which contain that data from its cache.

ただし、明示的に無効化するときに得られる追加のパフォーマンスが必要な場合があります。無効化の場合、アプリケーションはコンテンツの変更を検出し、そのデータを含む URL をキャッシュから削除するようキャッシュに指示する必要があります。

Tip

ヒント

If you want to use cache invalidation, have a look at the FOSHttpCacheBundle. This bundle provides services to help with various cache invalidation concepts and also documents the configuration for a couple of common caching proxies.

キャッシュの無効化を使用する場合は、FOSHttpCacheBundle を参照してください。このバンドルは、さまざまなキャッシュ無効化の概念を支援するサービスを提供し、いくつかの一般的なキャッシュ プロキシの構成も文書化します。

If one content corresponds to one URL, the PURGE model works well. You send a request to the cache proxy with the HTTP method PURGE (using the word "PURGE" is a convention, technically this can be any string) instead of GET and make the cache proxy detect this and remove the data from the cache instead of going to the application to get a response.

1 つのコンテンツが 1 つの URL に対応する場合は、PURGE モデルがうまく機能します。GET の代わりに HTTP メソッド PURGE (「PURGE」という言葉を使用するのは慣習であり、技術的にはこれは任意の文字列を使用できます) を使用してキャッシュ プロキシに要求を送信し、キャッシュを作成します。プロキシはこれを検出し、アプリケーションにアクセスして応答を取得する代わりに、キャッシュからデータを削除します。

Here is how you can configure the Symfony reverse proxy (See HTTP Cache) to support the PURGE HTTP method:

PURGE HTTP メソッドをサポートするように Symfony リバース プロキシ (HTTP キャッシュを参照) を構成する方法は次のとおりです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// src/CacheKernel.php
namespace App;

use Symfony\Bundle\FrameworkBundle\HttpCache\HttpCache;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
// ...

class CacheKernel extends HttpCache
{
    protected function invalidate(Request $request, bool $catch = false): Response
    {
        if ('PURGE' !== $request->getMethod()) {
            return parent::invalidate($request, $catch);
        }

        if ('127.0.0.1' !== $request->getClientIp()) {
            return new Response(
                'Invalid HTTP method',
                Response::HTTP_BAD_REQUEST
            );
        }

        $response = new Response();
        if ($this->getStore()->purge($request->getUri())) {
            $response->setStatusCode(Response::HTTP_OK, 'Purged');
        } else {
            $response->setStatusCode(Response::HTTP_NOT_FOUND, 'Not found');
        }

        return $response;
    }
}

Caution

注意

You must protect the PURGE HTTP method somehow to avoid random people purging your cached data.

PURGE HTTP メソッドをなんらかの方法で保護して、ランダムな人がキャッシュされたデータを削除しないようにする必要があります。

Purge instructs the cache to drop a resource in all its variants (according to the Vary header, see Varying the Response for HTTP Cache). An alternative to purging is refreshing the content. Refreshing means that the caching proxy is instructed to discard its local cache and fetch the content again. This way, the new content is already available in the cache. The drawback of refreshing is that variants are not invalidated.

Purge は、すべてのバリアントでリソースをドロップするようにキャッシュに指示します (Vary ヘッダーに従って、HTTP キャッシュの応答の変更を参照してください)。パージに代わる方法は、コンテンツを更新することです。リフレッシュとは、キャッシング プロキシがローカル キャッシュを破棄し、コンテンツを再度フェッチするように指示されることを意味します。このようにして、新しいコンテンツはすでにキャッシュで利用可能です。更新の欠点は、バリアントが無効にされないことです。

In many applications, the same content bit is used on various pages with different URLs. More flexible concepts exist for those cases:

多くのアプリケーションでは、異なる URL を持つさまざまなページで同じコンテンツ ビットが使用されます。これらの場合には、より柔軟な概念が存在します。
  • Banning invalidates responses matching regular expressions on the URL or other criteria;
    禁止すると、URL またはその他の基準の正規表現に一致する応答が無効になります。
  • Cache tagging lets you add a tag for each content used in a response so that you can invalidate all URLs containing a certain content.
    キャッシュのタグ付けを使用すると、応答で使用される各コンテンツにタグを追加できるため、特定のコンテンツを含むすべての URL を無効にすることができます。