セグメントキャッシュ
最終更新日 2021-07-28
Fastly のセグメントキャッシュを利用すると、ファイルサイズにかかわらずキャッシュすることができます。セグメントキャッシュは、リソースを Fastly のキャッシュ内でより小さなセグメントに分割し、これらのリソースを再結合または分割することで、クライアントからの任意のサイズのバイト範囲 (Range:
) リクエストに対応します。Range:
セグメントキャッシュを有効にすると、 リクエストに対するパフォーマンスが向上し、Fastly であらゆるサイズのリソースを効率的にキャッシュできるようになります。
サイズの大きなリソースを配信するサービスでは、セグメントキャッシュを有効にすることをお勧めします。セグメントキャッシュが有効化されていない場合、アカウントのリソースサイズ制限は、お客様が Fastly の使用を開始した時期によって異なります。
- 2020年6月17日以降にアカウントを作成し、セグメントキャッシュが有効化されていない場合、Fastly サービスの最大オブジェクトサイズは 20 MB です。
- 2020年6月17日以前にアカウントを作成し、セグメントキャッシュが有効化されていない場合、Fastly サービスでキャッシュ可能な最大オブジェクトサイズは、ストリーミングミスを使用しないリクエストでは 2 GB、ストリーミングミスを使用するリクエストでは 5 GB となります。
セグメントキャッシュの仕組み
セグメントキャッシュが有効化されているリソースにエンドユーザーが Range:
リクエストを送信し、キャッシュミスが発生した (つまり、リクエストされた範囲の少なくとも一部がキャッシュされていない) 場合、Fastly はオリジンに適切な Range:
リクエストを送信します。その際、セグメントキャッシュが有効な場合はリソース全体ではなく、エンドユーザーがリクエストしたリソースの特定の部分のみがキャッシュされます (オブジェクトのサイズに応じて丸められます)。キャッシュが部分的にヒットした場合、キャッシュヒットした部分はキャッシュから取得され、足りない部分がオリジンから取得されます。(リソース全体へのリクエストは、0からリソースの最後のバイトまでの Range:
リクエストとして扱われます)。
エンドユーザーのリクエストに応えるのに必要なオブジェクトがすべて揃ったら、セグメントキャッシュ機能によって、必要なオブジェクトやオブジェクトの一部が連結され、レスポンスが作成されます。オリジンへのリクエストは「インナーリクエスト」と呼ばれ、segmented_caching.is_inner_req
変数に true
が設定され、エンドユーザーからのリクエストは「アウターリクエスト」と呼ばれ、segmented_caching.is_outer_req
変数に true
が設定されます。 セグメントキャッシュが有効化されていないオブジェクトに対するリクエストの場合、両方の変数に対して FALSE が設定されます。
この機能では、エンドクライアントからのバイト範囲 (Range:
) リクエストを処理するのに必要なオブジェクトがない場合にのみ、オリジンにリクエストを送信します。エンドユーザーのバイト範囲リクエスト自体がユニークであっても、リクエストを処理するのに必要なオブジェクトがすべてキャッシュされている場合はキャッシュヒットと判断されます。
制約事項と注意点
本機能を利用するにあたり、以下のような制約事項と注意点を考慮する必要があります。
- セグメントキャッシュは、オブジェクトの圧縮機能 や ESI とは互換性がありません。 これらの機能を使用する場合は、セグメントキャッシュを必ず無効にしてください。
- セグメントキャッシュは、Fastly の イメージオプティマイザー (IO) とは互換性がありません。 IO が有効化されると、セグメントキャッシュは自動的に無効になります。
- Fastly とオリジン間の HTTP チャンク転送エンコーディングはサポートされていません。 オリジンサーバーは、
Range:
リクエストに対するレスポンスに必ずContent-Length
ヘッダーを使用する必要があります。 - URL パージの認証を有効化する必要があります。 セグメントキャッシュでは、URL パージによってリソースのすべての範囲オブジェクトをまとめてパージすることができますが、他に影響を与える可能性があるため、URL パージの認証を有効化する必要があります。パージに関するドキュメントで説明されているように、URL パージの認証トークンが提供されていることを確認してください。
- リソースのサイズに応じてセグメントキャッシュを有効化することはできません。 セグメントキャッシュを有効にする VCL コードは、リソースがキャッシュから要求される前に実行されなければならないため、リソースのサイズを知ることはできません。ただし、URL (例:
/video/
) やファイルの拡張子 (例:*.m4v) に応じてセグメントキャッシュを行うことは可能であり、これによるメリットがあるリソースに対してよく使用されます。拡張子に応じてセグメントキャッシュを有効にする方法の例については、次のセクションをご覧ください。 - セグメントキャッシュを有効化する前にキャッシュされたリソースは利用されません。 既存のサービスに対してセグメントキャッシュを有効にすると、すでにキャッシュされているリソースはすべて無視され、Varnish は範囲リクエストオブジェクトを構築するためにリクエストをオリジンに送信します。以前にキャッシュされたリソースはパージすることもできますし、放置した場合、時間が経つとキャッシュから削除されます。
- キャッシュヒット率 (CHR) が実際よりも低く表示されます。これは、アウターリクエストのみが考慮されるためです。例えば、リソースの最初の 100 MB がリクエストされ、100 MB のうち 99 MB が Fastly のキャッシュに保持されていても、CHR の統計ではこのリクエストはキャッシュミスとしてカウントされます。しかし実際には、オリジンから取得したのは 1 MB のみで、オリジンのオフロード率は99%でした。
セグメントキャッシュを有効にする
セグメントキャッシュは以下の手順で有効化することができます。
-
セグメントキャッシュを使用するリソースを決定します。
ヒントファイルの拡張子や明確な URL 構造のパスを使用してリソースを区別し、必要なリソースのみにこの機能を有効にすることをお勧めします。
- Home ページから、該当するサービスを選択します。検索ボックスを使用して ID、名前、またはドメインで検索することができます。
- Edit configuration ボタンをクリックし、アクティブなバージョンをクローンするオプションを選択します。ドメインページが表示されます。
- VCL Snippets をクリックします。VCL Snippets ページが表示されます。
- Create your first VCL snippet ボタンをクリックします。Create a VCL snippet ページが表示されます。
- Name フィールドに、適切な名前 (例:
Enable segmented caching
) を入力します。 - Type (placement of the snippets) から within subroutine を選択します。
- Select subroutine メニューから recv (vcl_recv) を選択します。
-
VCL フィールドに、
vcl_recv
でreq.enable_segmented_caching
VCL 変数をtrue
に設定する VCL スニペットを追加します。例えば、MPEG-2 で圧縮されたビデオデータを含む大容量のリソースを適切にキャッシュするために、以下のような VCL スニペットを vcl_recv に追加することができます。1 2 3 4
# my custom enabled Segmented Caching code if (req.url.ext == "ts") { set req.enable_segmented_caching = true; }
このスニペットは、
ts
の拡張子を持つファイルへのリクエストを特定し、それらのファイルに対してセグメントキャッシュを有効にするよう Fastly に指示します。 - Create をクリックしてスニペットを作成します。
- Activate ボタンをクリックして設定変更をデプロイします。