パフォーマンスを向上させ、ネットワークトラフィックの潜在的なボトルネックを減らすために、DataGraph では自動永続クエリがサポートされています。また、永続クエリをコンテンツ配信ネットワーク (CDN) と組み合わせて使用すると、DataGraph サーバーへの往復処理よりもはるかに速くキャッシュされた結果を配信できます。
DataGraph での自動永続クエリのしくみ
永続クエリを作成するには、次の情報を含む POST 要求を送信します。
-
GraphQL クエリとクエリ変数。
-
理想的には SHA-256 などのハッシュアルゴリズムを使用して作成された、一意の ID を含む
persistedQuery 拡張パラメーター。ハッシュを使用すると、競合の可能性が制限され、複数のクライアントが同じ ID を使用してクエリにアクセスできます。
永続クエリを作成したら、persistedQuery 拡張パラメーターとしてハッシュ ID を渡すことで、GET 要求を DataGraph に送信できます。
自動永続クエリを DataGraph に登録する
永続クエリを送信するには、次の要件を満たしている必要があります。
-
DataGraph コンシューム権限
-
有効なクライアント ID とシークレットを使用した DataGraph への認証済み接続
-
永続クエリの ID
永続クエリを登録するには、次の情報を含む POST 要求を送信します。
-
DataGraph インスタンスのエンドポイント
-
persistedQuery パラメーターを含む拡張機能 -
persistedQuery パラメーター内の ID -
GraphQL クエリと変数
次の例は、curl を使用して永続クエリを登録する方法を示しています。
curl --location --request POST 'https://<datagraph-endpoint>/graphql' \
--header 'Content-Type: application/json' \
--data-raw '{
"extensions": {
"persistedQuery": {
"version": 1,
"sha256Hash": "bcd3868f0cb4f723cdb5bdbc433d6ab73156f0b9d0e9d5bd17e200cdab6fba4"
}
},
"query": "{\n customers(customersCount: 30) {\n customerId\n name\n }\n}",
"variables": {}
}
DataGraph から永続クエリを要求する
DataGraph から永続クエリを要求するには、次の要件を満たしている必要があります。
-
DataGraph コンシューム権限
-
有効なクライアント ID とシークレットを使用した DataGraph への認証済み接続
永続クエリを要求するには、次の情報を含む GET 要求を作成します。
-
DataGraph インスタンスのエンドポイント
-
persistedQuery パラメーターを含む拡張機能 -
persistedQuery パラメーター内の ID
次の例は、curl を使用して永続クエリを要求する方法を示しています。
curl --location --request GET 'https://<datagraph-endpoint>/graphql?extensions=%7B%0A%20%20%22persistedQuery%22%3A%20%7B%0A%20%20%20%20%22version%22%3A%201%2C%0A%20%20%20%20%22sha256Hash%22%3A%20%22acf31818e50ac3e818ca4bdbc433d6ab73176f0b9d5f9d5ad17e200cdab6fba4%22%0A%20%20%7D%0A%7D'
クエリが見つからないエラーのトラブルシューティング
要求で ID を送信してクエリが見つからない場合、DataGraph はクエリは永続クエリでないというエラーを返します。
{
"errors": [
{
"message": "PersistedQueryNotFound",
"locations": [],
"extensions": {
"persistedQueryId": "bcd3868f0cb4f723cdb5bdbc433d6ab73156f0b9d0e9d5bd17e200cdab6fba4",
"classification": "PersistedQueryNotFound"
}
}
]
}
この時点で、クエリと ID を含む新しい POST 要求を送信してクエリを登録した後に、クエリを要求できます。
CDN での自動永続クエリの使用
コンテンツ配信ネットワーク (CDN) では、GET 操作への完全な応答をキャッシュして、API のパフォーマンスを高速化できます。
多くの CDN のキャッシュ機能は GET 要求のみをサポートしているため、DataGraph の永続クエリを CDN に同期して高速に取得できます。
| CDN を設定して操作する機能が必要です。 |
CDN が DataGraph の自動永続クエリと連携する方法
DataGraph の永続クエリを CDN と同期するプロセスは次のとおりです。
-
永続クエリを DataGraph に登録します。
-
永続クエリの ID を渡すことで、CDN に GET 要求を行います。
-
CDN によって要求が DataGraph に転送されます。
-
DataGraph は、API に追加した cache-control ディレクティブを含むヘッダーを使用して応答を返します。
-
応答が CDN に保存され、返送されます。
-
後続の GET 要求を CDN に発行し、応答を取得できます。
サポートされる cache-control ディレクティブ
cache-control ディレクティブは、CDN で応答をキャッシュする方法を定義します。DataGraph では、次の cache-control ディレクティブがサポートされています。
-
private: 応答を非公開キャッシュ (ブラウザーのローカルキャッシュなど) にのみ保存できることを示します。 -
public: 応答を共有キャッシュに保存できることを示します。 -
max-age: 応答が生成されてから n 秒後まで応答が最新なままであることを示します。 -
no-cache: 応答をキャッシュに保存できるものの、各再利用前に発信元サーバーで検証する必要があることを示します。 -
no-store: 非公開キャッシュでも公開キャッシュでも応答を保存しないことを示します。
次の例の cache-control ヘッダーは、応答を共有キャッシュに 10 分間保存できることを示しています。
“Cache-Control:public, max-age=600”
DataGraph の動的 cache-control
DataGraph は、永続化クエリの項目を解決するために使用される API から、cache-control ヘッダーの最も制限の厳しい値を自動的に選択します。
たとえば、それぞれに異なる max-age 値が含まれる 2 つの API の項目を含むクエリについて考えてみます。API-1 の max-age は 300 秒、API-2 の max-age は 500 秒です。クエリ応答の max-age ヘッダー値は、2 つの API の max-age として 300 秒を自動的に選択します。
CDN から永続クエリを要求する
CDN から永続クエリを要求するには、次の要件を満たしている必要があります。
-
DataGraph コンシューム権限。
-
有効なクライアント ID とシークレットを使用した DataGraph への認証済みパススルー接続。DataGraph に要求を渡すときにこれらの資格情報を追加するように CDN を設定するか、DataGraph へのルートの許可リストに資格情報ヘッダーを追加できます。
-
CDN からコンテンツを要求したり CDN に対して認証したりするための権限。
-
クエリの要求元の CDN へのエンドポイント。
extensions、variables、operationName、query クエリパラメーターを渡すように CDN を設定する必要があります。
|
CDN の永続クエリを要求するには、次の情報を含む GET 要求を作成します。
-
CDN へのエンドポイント
-
persistedQuery パラメーターを含む拡張機能 -
persistedQuery パラメーターのハッシュ ID
次の例は、curl を使用して CDN の永続クエリを要求する方法を示しています。
curl --location --request GET 'https://<cdn-endpoint>/graphql?extensions=%7B%0A%20%20%22persistedQuery%22%3A%20%7B%0A%20%20%20%20%22version%22%3A%201%2C%0A%20%20%20%20%22sha256Hash%22%3A%20%22acf31818e50ac3e818ca4bdbc433d6ab73176f0b9d5f9d5ad17e200cdab6fba4%22%0A%20%20%7D%0A%7D'