TL;DR
GraphQL のクエリのコスト(複雑度)をあらかじめ決めた方法で計算し、しきい値を超えたらリクエストを失敗させる仕組み。
例
Shopify
Shopify では、クライアントに一定時間ごとにポイントが割り当てられ、リクエストのたびにそのポイントを消費する。ポイントがなくなると、リクエストは失敗する。
消費するポイントは、次の要素から計算される。
- Mutation かどうか
- クエリするフィールドが、どの種類の値を返すか
interfaceやunionを含むか- Connection でいくつのデータを取得するか。Connection は関連するオブジェクトのリストを返すフィールドで、
firstやlastの引数で取得する件数を指定する。その件数によってコストが変わる
消費したポイントは、レスポンスの extensions で確認できる。
{
"extensions": {
"cost": {
"requestedQueryCost": 101,
"actualQueryCost": 46,
"throttleStatus": {
"maximumAvailable": 1000,
"currentlyAvailable": 954,
"restoreRate": 50
}
}
}
}requestedQueryCost は予測した消費ポイント、actualQueryCost は実際の消費ポイントである。maximumAvailable はクライアントに割り当てられるポイントの上限、currentlyAvailable は残りのポイント、restoreRate は 1 秒ごとに回復するポイントを表す。
GitHub
GitHub の GraphQL API にも、同様のレート制限がある。