Предельное число узлов
Чтобы пройти проверку схемы, все вызовы API GraphQL должны соответствовать следующим стандартам:
- Клиенты должны предоставлять аргумент
first
илиlast
для любого подключения. - Значения
first
иlast
должны находиться в пределах 1–100. - В отдельных вызовах не может запрашивать более 500 000 узлов.
Подсчет узлов в вызове
В этих двух примерах показано, как вычислить общее количество узлов в вызове.
-
Простой запрос:
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
-
Сложный запрос:
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 }
.
- Сложите количество запросов, необходимых для выполнения каждого уникального подключения в вызове. Предположим, что каждый запрос будет достигать ограничений для аргумента
first
илиlast
. - Разделите число на 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.