跳至主要内容

GraphQL API 的速率限制和节点限制

GitHub GraphQL API 设有限制,以防止对 GitHub 服务器进行过度或滥用调用。

节点限制

为了通过 模式 验证,所有 GraphQL API 调用 必须符合以下标准

  • 客户端必须在任何 连接 上提供 firstlast 参数。
  • firstlast 的值必须在 1-100 之间。
  • 单个调用不能请求超过 500,000 个总 节点

计算调用中的节点

以下两个示例展示了如何计算调用中的总节点数。

  1. 简单查询

    query {
      viewer {
        repositories(first: 50) {
          edges {
            repository:node {
              name
    
              issues(first: 10) {
                totalCount
                edges {
                  node {
                    title
                    bodyHTML
                  }
                }
              }
            }
          }
        }
      }
    }

    计算

    50         = 50 repositories
     +
    50 x 10  = 500 repository issues
    
                = 550 total nodes
  2. 复杂查询

    query {
      viewer {
        repositories(first: 50) {
          edges {
            repository:node {
              name
    
              pullRequests(first: 20) {
                edges {
                  pullRequest:node {
                    title
    
                    comments(first: 10) {
                      edges {
                        comment:node {
                          bodyHTML
                        }
                      }
                    }
                  }
                }
              }
    
              issues(first: 20) {
                totalCount
                edges {
                  issue:node {
                    title
                    bodyHTML
    
                    comments(first: 10) {
                      edges {
                        comment:node {
                          bodyHTML
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
    
        followers(first: 10) {
          edges {
            follower:node {
              login
            }
          }
        }
      }
    }

    计算

    50              = 50 repositories
     +
    50 x 20       = 1,000 pullRequests
     +
    50 x 20 x 10 = 10,000 pullRequest comments
     +
    50 x 20       = 1,000 issues
     +
    50 x 20 x 10 = 10,000 issue comments
     +
    10              = 10 followers
    
                     = 22,060 total nodes

主要速率限制

GraphQL API 为每个查询分配点数,并限制您在特定时间内可以使用点数。此限制有助于防止滥用和拒绝服务攻击,并确保 API 对所有用户可用。

REST API 也有单独的主要速率限制。有关更多信息,请参阅“REST API 的速率限制”。

通常,您可以根据您的身份验证方法计算 GraphQL API 的主要速率限制

  • 对于用户:每小时每用户 5,000 点。这包括使用个人访问令牌发出的请求,以及 GitHub App 或 OAuth App 代表授权该 App 的用户发出的请求。GitHub Enterprise Cloud 组织拥有的 GitHub App 代表用户发出的请求具有更高的速率限制,为每小时 10,000 点。类似地,如果您是 GitHub Enterprise Cloud 组织的成员,则由 GitHub Enterprise Cloud 组织拥有或批准的 OAuth App 代表您发出的请求具有更高的速率限制,为每小时 10,000 点。
  • 对于未安装在 GitHub Enterprise Cloud 组织上的 GitHub App 安装:每个安装每小时 5,000 点。拥有超过 20 个仓库的安装,每个仓库每小时额外获得 50 点。安装在拥有超过 20 个用户的组织上的安装,每个用户每小时额外获得 50 点。速率限制不能超过每小时 12,500 点。用户访问令牌(与安装访问令牌相对)的速率限制由用户的首要速率限制决定。
  • 对于安装在 GitHub Enterprise Cloud 组织上的 GitHub App 安装:每个安装每小时 10,000 点。用户访问令牌(与安装访问令牌相对)的速率限制由用户的首要速率限制决定。
  • 对于 OAuth 应用:每小时 5,000 点,如果应用由 GitHub Enterprise Cloud 组织拥有,则为每小时 10,000 点。这仅适用于应用使用其客户端 ID 和客户端密钥请求公共数据时。由 OAuth 应用生成的 OAuth 访问令牌的速率限制由用户的首要速率限制决定。
  • 对于 GitHub Actions 工作流中的 GITHUB_TOKEN:每个仓库每小时 1,000 点。对于对属于 GitHub.com 上企业帐户的资源的请求,限制为每个仓库每小时 15,000 点。

您可以按照以下部分的说明检查查询的点数或计算预期的点数。计算点数的公式和速率限制可能会发生变化。

检查您的首要速率限制状态

您可以使用每个响应中发送的标头来确定您的首要速率限制的当前状态。

标头名称描述
x-ratelimit-limit您每小时可以使用点数的最大值
x-ratelimit-remaining当前速率限制窗口中剩余的点数
x-ratelimit-used您在当前速率限制窗口中使用的点数
x-ratelimit-reset当前速率限制窗口重置的时间,以 UTC 纪元秒为单位
x-ratelimit-resource请求计入的速率限制资源。对于 GraphQL 请求,这将始终为 graphql

您还可以查询 rateLimit 对象以检查您的速率限制。在可能的情况下,您应该使用速率限制响应标头而不是查询 API 来检查您的速率限制。

query {
  viewer {
    login
  }
  rateLimit {
    limit
    remaining
    used
    resetAt
  }
}
字段描述
限制您每小时可以使用点数的最大值
剩余当前速率限制窗口中剩余的点数
已使用您在当前速率限制窗口中使用的点数
重置时间当前速率限制窗口重置的时间,以 UTC 纪元秒为单位

返回查询的点数

可以通过查询 rateLimit 对象上的 cost 字段来返回查询的点数

query {
  viewer {
    login
  }
  rateLimit {
    cost
  }
}

预测查询的点数

您也可以在进行查询之前粗略地计算查询的点数。

  1. 将满足每个唯一连接所需的请求数量加起来。假设每个请求都将达到 firstlast 参数限制。
  2. 将该数字除以 100 并将结果四舍五入到最接近的整数,以获得最终的聚合点数。此步骤将对大数字进行标准化。

注意:对 GraphQL API 的调用的最小点数为 1

以下是一个示例查询和分数计算

query {
  viewer {
    login
    repositories(first: 100) {
      edges {
        node {
          id

          issues(first: 50) {
            edges {
              node {
                id

                labels(first: 60) {
                  edges {
                    node {
                      id
                      name
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

此查询需要 5,101 个请求才能完成

  • 虽然我们返回了 100 个仓库,但 API 必须连接到查看者的帐户 一次 以获取仓库列表。因此,仓库请求 = 1
  • 虽然我们返回了 50 个问题,但 API 必须连接到每个 100 个仓库以获取问题列表。因此,问题请求 = 100
  • 虽然我们返回了 60 个标签,但 API 必须连接到每个 5,000 个潜在的总问题以获取标签列表。因此,标签请求 = 5,000
  • 总计 = 5,101

除以 100 并四舍五入得到查询的最终分数:51

二级速率限制

除了主要速率限制之外,GitHub 还实施了二级速率限制,以防止滥用并确保 API 可供所有用户使用。

如果您遇到以下情况,可能会遇到二级速率限制

  • 进行过多的并发请求。 不允许超过 100 个并发请求。此限制在 REST API 和 GraphQL API 中共享。
  • 每分钟对单个端点进行过多的请求。 REST API 端点每分钟不允许超过 900 个点,GraphQL API 端点每分钟不允许超过 2,000 个点。有关点的更多信息,请参阅“计算二级速率限制的点数”。
  • 每分钟进行过多的请求。 每 60 秒的实际时间不允许超过 90 秒的 CPU 时间。GraphQL API 的 CPU 时间不得超过 60 秒。您可以通过测量 API 请求的总响应时间来粗略估计 CPU 时间。
  • 在短时间内在 GitHub 上创建过多内容。 通常,每分钟不超过 80 个内容生成请求,每小时不超过 500 个内容生成请求。某些端点具有更低的内容创建限制。内容创建限制包括在 GitHub 网页界面以及通过 REST API 和 GraphQL API 执行的操作。

这些次级速率限制可能会在未经通知的情况下更改。您也可能因未公开的原因遇到次级速率限制。

计算次级速率限制的点数

一些次级速率限制由请求的点数决定。对于 GraphQL 请求,这些点数与主速率限制的点数计算是分开的。

请求点数
没有突变的 GraphQL 请求1
带有突变的 GraphQL 请求5
大多数 REST API 的 GETHEADOPTIONS 请求1
大多数 REST API 的 POSTPATCHPUTDELETE 请求5

某些 REST API 端点具有不同的点数成本,不会公开。

超过速率限制

如果您超过了主速率限制,响应状态仍然是 200,但您会收到错误消息,并且 x-ratelimit-remaining 标头的值为 0。您应该在 x-ratelimit-reset 标头指定的时间之后重试您的请求。

如果您超过了次级速率限制,响应状态将是 200403,并且您会收到一条错误消息,表明您遇到了次级速率限制。如果 retry-after 响应标头存在,您应该在经过那么多秒后重试您的请求。如果 x-ratelimit-remaining 标头为 0,您应该在 x-ratelimit-reset 标头指定的 UTC 时间戳(以秒为单位)之后重试您的请求。否则,请等待至少一分钟后再重试。如果您的请求继续因次级速率限制而失败,请在重试之间等待指数增长的时长,并在特定次数的重试后抛出错误。

在您受到速率限制时继续发出请求可能会导致您的集成被禁止。

保持在速率限制内

为了避免超过速率限制,您应该在每次修改请求之间至少暂停 1 秒,并避免并发请求。

您还应该订阅 webhook 事件,而不是轮询 API 获取数据。有关更多信息,请参阅“Webhook 文档”。