Skip to main content
Мы публикуем частые обновления нашей документации, и перевод этой страницы может все еще выполняться. Актуальные сведения см. в документации на английском языке.

Ограничения ресурсов

API GraphQL GitHub имеет ограничения для защиты от чрезмерных вызовов к серверам GitHub или злоупотребления ими.

Предельное число узлов

Чтобы пройти проверку схемы, все вызовы API GraphQL должны соответствовать следующим стандартам:

  • Клиенты должны предоставлять аргумент first или last для любого подключения.
  • Значения first и last должны находиться в пределах 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

Ограничение скорости

Ограничение скорости для API GraphQL версии 4 отличается от ограничения скорости для REST API.

Почему различаются ограничения скорости API? Один вызов GraphQL может заменять несколько вызовов REST. Один сложный вызов GraphQL может быть эквивалентен тысячам запросов REST. Хотя вызов GraphQL может спокойно укладываться в ограничение скорости REST API, запрос может быть столь же затратным для обработки на серверах GitHub.

Чтобы точно представить затраты на обработку запроса на сервере, API GraphQL вычисляет оценку ограничения скорости для вызова на основе нормализованной шкалы баллов. При оценке запроса учитываются первый и последний аргументы родительского соединения и его дочерних элементов.

  • Формула использует first аргументы и last для родительского соединения и его дочерних элементов для предварительного вычисления потенциальной нагрузки на системы GitHub, такие как MySQL, Elasticsearch и Git.

  • Каждое новое соединение имеет собственное значение. Баллы объединяются с другими баллами вызова в общую оценку ограничения скорости.

    Ограничение скорости API GraphQL составляет 5000 точек в час.

Примечание. Текущая формула и ограничение скорости могут изменяться по мере наблюдения за тем, как разработчики используют API GraphQL.

Возвращение состояния ограничения скорости для вызова

При использовании REST API состояние ограничения скорости можно проверить, просмотрев возвращенные заголовки HTTP.

При использовании API GraphQL состояние ограничения скорости можно проверить, запросив поля объекта rateLimit:

query {
  viewer {
    login
  }
  rateLimit {
    limit
    cost
    remaining
    resetAt
  }
}
  • В поле limit возвращается максимальное количество баллов, которое клиент может использовать за 60-минутный период.

  • В поле cost возвращается стоимость в баллах для текущего вызова, который засчитывается при определении ограничения скорости.

  • Поле remaining возвращает количество точек, оставшихся в текущем окне ограничения скорости.

  • Поле resetAt возвращает время сброса текущего окна ограничения скорости в формате ISO 8601.

Вычисление оценки ограничения скорости перед выполнением вызова

При запросе объекта rateLimit возвращается оценка для вызова, но этот запрос учитывается при расчете ограничения. Чтобы избежать этой проблемы, можно вычислить оценку для вызова перед его выполнением. Приведенный ниже расчет дает примерно тот же результат, что и rateLimit { cost }.

  1. Сложите количество запросов, необходимых для выполнения каждого уникального подключения в вызове. Предположим, что каждый запрос будет достигать ограничений для аргумента first или last.
  2. Разделите число на 100 и округлите результат, чтобы получить итоговые совокупные затраты. На этом шаге нормализуется большое число.

Примечание. Минимальная стоимость вызова API GraphQL равна 1, что соответствует одному запросу.

Ниже приведен пример запроса и вычисления оценки.

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

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

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

Для выполнения этого запроса требуется 5101 вызов:

  • Хотя возвращается 100 репозиториев, API должен подключиться к учетной записи зрителя один раз, чтобы получить список репозиториев. Таким образом, число запросов для репозиториев = 1.
  • Хотя возвращается 50 проблем, API должен подключиться к каждому из 100 репозиториев, чтобы получить список проблем. Таким образом, число запросов для проблем = 100.
  • Хотя возвращается 60 меток, API должен подключиться к каждой из 5000 потенциальных проблем, чтобы получить список меток. Таким образом, число запросов для меток = 5000.
  • Всего 5101 запрос.

Разделим на 100, округлим, и получим окончательную оценку для запроса: 51.