DOCS

GraphQL API レート制限

GraphQL API レート制限

Zonos が複雑さに基づいてクエリ コストを計算する方法を学びます。

Zonos レートは、リクエスト数ではなくクエリの複雑さに基づいて GraphQL API リクエストを制限します。これにより、公正な使用が確保され、必要なデータを正確にリクエストできるようになります。

なぜ複雑さに基づいてレート制限を行うのでしょうか? 

従来の REST APIs はリクエストベースのレート制限を使用しており、サーバー負荷に大きな違いがあるにもかかわらず、1 つのフィールドをフェッチするか数百のフィールドをフェッチするかにかかわらず、またデータの読み取りまたは変更にかかわらず、すべてのリクエストが同じクレジットを消費します。

GraphQL のクエリの複雑さベースのアプローチは、要求された実際のデータと実行された操作に基づいてコストを計算することで、この問題を解決します。これにより、予測可能なサーバー負荷を提供しながら、必要なものをより柔軟にリクエストできるようになります。

レート制限 

Zonos は、各クエリの複雑さに基づいてポイントを減算するポイントベースのシステムを使用します。次のような利用可能なポイントがプールされています。

  • 1 秒あたり 3,000 ポイント (10 秒あたり 30,000 ポイント) で補充
  • 最大容量は 300,000 ポイントです

これにより、持続可能なリクエストのペースを維持しながら、複雑なクエリを時折バーストすることができます。

クエリコストの計算方法 

すべての GraphQL リクエストには、実行前にコストが計算されます。

基本コスト

  • クエリ: 5 ポイント
  • ミューテーション: 10 ポイント
  • オブジェクト: オブジェクトごとに 1 ポイントが返されます
  • スカラー フィールド: 0 ポイント (無料)

文字列、整数、ID、ブール値などのスカラー フィールドはコストを追加しません。料金を支払うのは、基本操作と返されたオブジェクトの料金のみです。

例: 単純なクエリ

1query {
2 landedCost(id: "123") {
3 id
4 createdBy
5 shipToCountry
6 }
7}

コストの内訳: 5 (基本クエリ) + 1 (Landed Cost オブジェクト) = 6 ポイント

スカラー フィールド (idnamecurrency) は無料です。

例: 複数のオブジェクトを使用したクエリ

1{
2 orders(first: 10, filter: { status: COMPLETED }) {
3 edges {
4 cursor
5 node {
6 id
7 }
8 }
9 }
10}

コストの内訳: 5 (基本クエリ) + 10 (10 注文 × 各 1 ポイント) = 15 ポイント

例: ミューテーション

1mutation {
2 landedCostCalculate(input: { ... }) {
3 id
4 }
5}

コストの内訳: 10 (基本ミューテーション) + 約 50 (返されたオブジェクト) = 60 ポイント

一般的な Landed Cost の計算には、約 60 ポイントの複雑さが伴います。

クエリの複雑さの表示 

すべての API 応答には、クエリのコストを示す zonos-query-complexity ヘッダーが含まれています。

1zonos-query-complexity: 58

このヘッダーは、クエリが消費したポイント数を正確に示します。これを使用して、API の使用状況を監視し、高価なクエリを最適化します。

レート制限の処理 

レート制限を超えると、エラー メッセージが表示されます。レート制限を効果的に処理するには:

複雑さを監視する

応答内の zonos-query-complexity ヘッダーを確認して、クエリのコストを理解し、高価なパターンを特定します。

再試行ロジックの実装

レート制限に達した場合は、指数バックオフを実装し、ロジックを再試行します。バケットは 1 秒あたり 3,000 ポイントで補充されるため、クエリの複雑さに基づいて適切な待機時間を計算します。

効率的なバッチ処理

GraphQL を使用すると、1 つのリクエストで複数のクエリをリクエストできます。

1{
2 landedCost(id: "landed_cost_123") {
3 id
4 createdAt
5 }
6 order(orderId: "order_123") {
7 id
8 status
9 createdAt
10 }
11}

ベストプラクティス 

必要なものだけをリクエストしてください

クエリの複雑さは、リクエストするデータに比例します。実際に使用するフィールドとオブジェクトのみを取得するようにクエリを構成します。

1query {
2 order(orderId: "order_123") {
3 id
4 status
5 createdAt
6 updatedAt
7 items {
8 id
9 name
10 quantity
11 amount
12 }
13 shipments {
14 id
15 }
16 }
17}

大規模なデータセットのページネーション

複数のオブジェクトをリクエストする場合は、適切なページ サイズを使用してください。

1{
2 orders(first: 100, filter: { status: COMPLETED }) {
3 edges {
4 cursor
5 node {
6 id
7 }
8 }
9 }
10}

単一のクエリで数百のオブジェクトをリクエストするのではなく、一度に 10 ~ 50 のアイテムをリクエストし、必要に応じて結果をページ分割します。

不必要なネストを避ける

ネストされたオブジェクトごとに複雑さが増します。ネストされたデータは、実際に必要な場合にのみ要求してください。

このページは役に立ちましたか?


このページでは: