Open6

Github GraphQL API レート制限

t-yngt-yng

スコア計算について

GraphQL API v4は呼び出しのレート制限スコアを正規化されたポイントのスケールに基づいて計算します。 クエリのスコアは、親のコネクションやその子のfirst及びlast引数を計算に入れます。

・この式は、MySQLやElasticSearch、GitといったGitHubのシステムの潜在的な負荷を事前計算するために、親のコネクション及びその子のfirst及びlast引数を使います。
・新しいコネクションはそれぞれ独自のポイント値を持ちます。 ポイントは呼び出しからの他のポイントと組み合わされて、全体としてのレート制限スコアになります。

t-yngt-yng

reteLimit オブジェクトのフィールドをクエリすることで、対象のクエリのレート制限のスコアを把握する事ができる。

当然、スコアを知るためのクエリにもスコア計算は適用される。

query {
  viewer {
    login
  }
  rateLimit {
    limit
    cost
    remaining
    resetAt
  }
}
t-yngt-yng

スコアの計算方法

  1. リソースを取得するために必要なリクエスト数を first , last の引数の最大数を掛け合わせて計算する
  2. 合計値を100で割り、結果を丸めた値がスコアとして消費される
t-yngt-yng

次のクエリのスコアを計算してみる

  • 最初に100件のプルリクエストを取得するためのリクエストは1回なので リクエスト数 = 1
  • 100件のレビューとレビューリクエストを取得するために、100件のプルリクエストに接続する必要があるので リクエスト数 = 100
  • 合計 = 101
  • スコア = 101 / 100 = 1.01 = 1
query {
  search(type: ISSUE, query: "react", last: 100) {
    nodes {
      ... on PullRequest {
        reviews(last: 100) {
          totalCount
        }
        reviewRequests(last: 100) {
          totalCount
        }
      }
    }
  }
}
t-yngt-yng

次のクエリを Github Explorer で実行して答え合わせ

query {
  search(type: ISSUE, query: "react", last: 100) {
    nodes {
      ... on PullRequest {
        reviews(last: 100) {
          totalCount
        }
        reviewRequests(last: 100) {
          totalCount
        }
      }
    }
  }
  
  rateLimit {
    cost
  }
}

合ってる

{
  "data": {
    "search": {
      "rateLimit": {
        "cost": 1
      }
    }
  }
}