サロゲートキーによる API キャッシュのパージ

Fastly は API のキャッシュを可能にすることで、サービス指向アーキテクチャのパフォーマンスを加速させます。もちろん API をキャッシュすることと、API キャッシュを効率的に無効にすることは全く別の問題です。API のキャッシュを有効にし、API キャッシュのコントロールを実装している場合、フィル·カールトン氏が的確に説明しているこの問題に通常、遭遇します。

コンピューターサイエンスの世界で難しいのは、キャッシュの無効化と名前の付け方の2つのみです。

このガイドでは、Fastly API でサロゲートキーを使用して API キャッシュをパージする方法をご説明します。サロゲートキーを使用して複数のキャッシュパージをキーベースの単一のパージにまとめることで、API のキャッシュの複雑さを軽減することができます。

サロゲートキーについて

サロゲートキーにより、関連するコンテンツを選択的にパージすることができます。Surrogate-Key のヘッダーを使用して、画像やブログ記事などのオブジェクトに、1つまたは複数のキーで「タグ付けする」ことができます。Surrogate-KeyFastly はオリジンサーバーからオブジェクトを取得する際、お客様が のヘッダーを指定しているかどうかを確認します。このヘッダーが指定されている場合、キーごとに用意されたリストにレスポンスが追加されます。

あるキーに関連するすべてのレスポンスをパージしたい場合は、キーによるパージリクエストを送信すると、そのキーに関連するすべてのオブジェクトがパージされます。これにより、多くのパージを1つのリクエストにまとめることができます。結果的に、分類された関連データの管理が容易になります。

サロゲートキーについての詳細や、アプリケーションへの統合方法については、サロゲートキーの使用に関するガイドをご参照ください。

例:カテゴリーのパージ

サロゲートキーが API エンドポイントと連動してどのように機能するかを理解するため、オンラインストアと商品情報を返す API エンドポイントがあると想定します。ユーザーが「キーボード」などの特定の商品に関する情報を得ようとする場合、リクエストは以下のようになります。

1
GET /product/12345

API が Fastly を使用していて、レスポンスがまだキャッシュされていない場合、Fastly は API のオリジンサーバーにリクエストを行い、以下のようなレスポンスを受け取ります。

1
2
3
4
5
6
7
HTTP/1.1 200 OK
Content-Type: text/json
Cache-Control: private
Surrogate-Control: max-age=86400
Surrogate-Key: peripherals keyboards

{id: 12345, name: "Uber Keyboard", price: "$124.99"}

商品カテゴリー全体のパージが必要になる場合があることが分かっているため、peripheralskeyboards の商品カテゴリーをキーとして Surrogate-Key ヘッダーに含めます。Fastly はこのようなレスポンスを受信すると、内部マップに追加し、Surrogate-Key ヘッダーを除去し、レスポンスをキャッシュしてエンドユーザーに配信します。

ここで、お客様の会社がすべての周辺機器に10%の割引を適用することを決めたとします。以下のようなキーによるパージをリクエストして、peripherals のサロゲートキーでタグ付けされたすべてのオブジェクトを無効にすることができます。

1
PURGE /service/:service_id/peripherals

Fastly はこのリクエストを受け取ると、peripherals のサロゲートキーに関連付けられたコンテンツのリストを参照し、リスト内のすべてのコンテンツを体系的にパージします。

依存関係

API はサロゲートキーを使用して、最終的に同時にパージする必要のある大量のアイテムをグループ化することができます。先ほどの例を考えてみましょう。オンラインストアの API では、商品の種類、特定のセール、またはメーカーごとにサロゲートキーを設定することができます。

この観点から言えば、Surrogate-Key ヘッダーは Fastly に異なる API エンドポイント間の関係と依存性の可能性についての情報を提供することになります。API において2つの異なるタイプのリソースが関係している場合、サロゲートキーを使用してそれらを分類しておくと便利な場合があります。

例:商品レビューや商品の使用画像のパージ

サロゲートキーが依存関係の処理にどのように役立つかを理解するため、お客様のオンラインストアで、購入者が商品のレビューや商品を使用している様子を撮影した画像を投稿できるようにするとします。このような新機能に対応するためには、API を変更する必要があります。まず、新しい review のエンドポイントを作成します。

1
2
GET /review/:id
POST /review

次に、新しい action_shot のエンドポイントを作成します。

1
2
POST /product/:id/action_shot
GET /product/:id/action_shot/:shot_id

いずれのエンドポイントも特定の商品に関連しているため、関連する商品の情報が変更された場合に、これらのエンドポイントをパージする必要があります。サロゲートキーはこのようなユースケースに最適です。reviewaction_shot を修正して以下のようなヘッダーを返すようにすることで、これを実装できます。

1
Surrogate-Key: product/:id

これにより、各エンドポイントがキャッシュ内の特定の商品 (:id は商品固有の識別子) に関連付けられます。商品情報が変更されると、お客様の API は以下のようなサロゲートキーによるパージをリクエストします。

1
POST https://api.fastly.com/service/:service_id/purge/product/:id

Fastly はこのリクエストを受け取ると、関連する各エンドポイントを同時にパージします。

テーマのバリエーション

また、お客様の API に単一のソースから派生した多くの異なるエンドポイントがある場合もサロゲートキーの使用を検討することをお勧めします。ソースデータが変更されるたびに、それに関連する各エンドポイントをキャッシュからパージする必要があります。各エンドポイントをサロゲートキーに関連付けることで、ソースが変更された場合に単一のパージリクエストを送信してキャッシュからこれらのエンドポイントをパージすることができます。

例:商品画像のパージ

この仕組みを理解するため、お客様のオンラインストアに、様々なサイズの商品画像を取得する API エンドポイントがあると想定します。

1
GET /product/:id/image/:size

このエンドポイントは、指定された :id の商品の適切な :size (例えば smallmediumlarge) の画像を返します。ディスクスペースを節約するため、ImageMagick などの画像処理ライブラリを使用して、1つのソース画像から特定のサイズの画像を API で生成したいとします。セールス & マーケティングチームは、API を使用して新しい商品画像をアップロードするため、サロゲートキーを含むエンドポイントを設定します。

1
Surrogate-Key: product/:id/image

商品画像をアップロードする PUT エンドポイントが呼び出されると、API は以下のようなパージリクエストを送信します。

1
POST https://api.fastly.com/service/:service_id/purge/product/:id/image

Fastly はこのリクエストを受け取ると、商品画像のあらゆるサイズのバリエーションをパージします。

Back to Top