API キャッシングの有効化

アプリケーション・プログラミング・インターフェイス (API) を利用すると、さまざまな Web サービスからデータを取得することができます。Fastly では、API をキャッシュして、サービス指向アーキテクチャのパフォーマンスを高速化することができます。トラフィックの急増に効率的に対応し、レイテンシを削減することで、API のパフォーマンスを最適化します。

次の例では、API キャッシングの仕組みについて説明します。掲載された記事にユーザーがコメントできるオンラインマガジンを運営しているとします。それぞれの記事には多数のコメントを付けられますが、各コメントは厳格に1人のユーザーによって作成されるものとします。

Relational schema for the database of the website

RESTful API の仕様を設計し、次のようにそれらを利用してコメントを操作・取得します。

  • GET /comment - 全コメントのリストを返す
  • GET /comment/:id- 指定した ID でコメントを返す
  • POST /comment- 新規コメントを作成する
  • PUT /comment/:id- 指定した ID でコメントを更新する
  • DELETE /comment/:id - 指定した ID でコメントを削除する

作成、読み取り、更新、削除 (CRUD) メソッドでは、API による基本的な操作を実行できますが、データの関係を表すことはできません。これを行うには下記のような2つの関係エンドポイントを追加します。

  • GET /articles/:article_id/comments - 指定した記事のコメントのリストを取得する
  • GET /user/:user_id/comments - 指定したユーザーの全コメントを取得する

プログラマーはこれらのエンドポイントを利用して、記事の HTML ページをレンダリングしたり、ユーザーのプロフィールページにコメントを表示したりするために必要な情報を取得することができます。他にもさまざまなエンドポイントの構築が考えられますが、このガイドの目的にはこのセットで十分です。ここでは、ActiveRecord などのオブジェクト関係マッピング (ORM) を使用してデータベースと対話するように API がプログラムされていると仮定します。

キャッシュする API エンドポイントの決定

まず、キャッシュしたい URL を洗い出します。仕様のエンドポイントを2つのグループに分けることをお勧めします。

最初のグループは「アクセサ」と呼ばれ、コメントデータの取得やアクセスを行います。これらのエンドポイントは Fastly を利用してキャッシュします。この例でのアクセサは、以下4つのエンドポイントになります。

  • GET /comment
  • GET /comment/:id
  • GET /article/:article_id/comments
  • GET /user/:user_id/comments

2つ目のグループは「ミューテーター」と呼ばれ、コメントデータを変更します。これらのエンドポイントは常に動的であるため、キャッシュできません。この例でのミューテータは、以下3つのエンドポイントになります。

  • POST /comment
  • PUT /comment/:id
  • DELETE /comment/:id

パターンが見えてきましたでしょうか。この例の API は RESTful なので、GET エンドポイントはキャッシュでき、PUT、POST、および DELETE エンドポイントはキャッシュできないという単純なルールによって、アクセサのエンドポイントとミューテーターのエンドポイントを区別することができます。

これらの情報を収集したら、次に PURGE リクエストを設定する API をプログラムします。

PURGE リクエストの設定

データが変更される場所を PUT、POST、および DELETE エンドポイントに指定したい気持ちに駆られるかもしれませんが、これはご遠慮ください。最近の API ではほとんどの場合、これらのエンドポイントはデータベースの変更処理を担当する実際のモデルコードへのインターフェイスを表します。

この例では、実際のデータベース作業を ORM を使用して行うことを想定しています。ほとんどの ORM では、プログラマーが特定のアクションが実行されたときに起動する特別な「コールバック」をモデルに設定できます (例:検証の前後または新規レコードの作成後)。

パージでは、モデルがデータベースに情報を保存したか、つまり、新規レコードを作成したか、既存レコードを更新したか、あるいはレコードを削除したかどうかに関心を払います。ここでは、Fastly にキャッシュ可能な各エンドポイントへの PURGE リクエストを送信するように API に指示をするコールバックを追加しています。

ActiveRecord のコメントモデルの場合は、次のように行います。

1
2
3
4
5
6
7
8
9
10
11
12
require 'fastly'

class Comment < ActiveRecord::Base
  fastly = Fastly.new(api_key: 'FASTLY_API_TOKEN')

  after_save do
    fastly.purge "/comment"
    fastly.purge "/comment/#{self.id}"
    fastly.purge "/article/#{self.article_id}/comments"
    fastly.purge "/user/#{self.user_id}/comments"
  end
end

コールバックを作成する際は、次の2点に注意してください。

  • パージコードは、情報がデータベースに保存された後にトリガーされる必要があります。さもないと、データがデータベースに保存される前に Fastly がオリジンサーバーからデータをフェッチすることにより競合状態が発生する可能性があります。これにより、新しいデータではなく、古いデータがキャッシュされていまいます。
  • これらの URLは、コメントが変更されると変化するコンテンツを持っているため、パージされます。

モデルコードが完成したら、API がキャッシュされるようになります。

Fastly のセットアップ

API のキャッシングを有効にする最終ステップは、Fastly の設定です。次の作業が必要です。

また、お客様の API に限定した特定の要素の処理方法を Fastly に指示するためのルールをオプションで作成することができます。

新規サービスを作成する

新規サービスを作成するには記載の手順に従ってください。Create a new service フィールドに入力する際に、API サーバーに関する以下の具体的な詳細を追加します。

  • Name フィールドに、API 情報のキャッシュに関連するサービスであることがわかるようなサービス名を入力します (例:My API Service)。
  • Domain フィールドに、API に関連付けられたドメイン名を入力します (例:api.example.com)。
  • Address フィールドに、API サーバーの IP アドレスやホスト名を入力します。

ドメインの追加

以下の手順に従って、Fastly サービスに API のドメイン名を追加します。

  1. Configure ページの Configuration ボタンをクリックし、Clone active を選択します。Domains ページが表示されます。
  2. Create domain ボタンをクリックします。Create a domain ページが表示されます。

    Create a domain page.

  3. 以下の要領で Create a domain フィールドに入力します。
    • Domain Name フィールドに、API のドメイン名を入力します。
    • Comment フィールドに、ドメインを説明するコメントをオプションで入力します。
  4. Create をクリックします。ドメインリストに API のドメイン名が表示されます。

オリジンサーバーの追加

以下の手順に従って、オリジンに接続 します。Create a host フィールドに記入する際に、API サーバーに関する具体的な次の情報を追加します。

  • Name フィールドに、API 情報のキャッシングに関与するオリジンサーバーであることを判別しやすい名前を入力します。
  • Address フィールドに、API サーバーの IP アドレス (またはホスト名) を入力します。
Back to Top