DOCS

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

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

Узнайте, как Zonos рассчитывает стоимость запроса на основе сложности.

Zonos ограничивает запросы GraphQL API на основе сложности запроса, а не количества запросов. Это обеспечивает справедливое использование, позволяя вам запрашивать именно те данные, которые вам нужны.

Почему ограничение скорости на основе сложности? 

Традиционные REST API используют ограничение скорости на основе запросов, где каждый запрос потребляет одинаковое количество кредитов, независимо от того, получаете ли вы одно поле или сотни, и независимо от того, читаете ли вы или модифицируете данные — несмотря на значительную разницу в нагрузке на сервер.

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

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

Zonos использует систему на основе очков, где каждый запрос вычитает очки в зависимости от его сложности. У вас есть пул доступных очков, который:

  • Пополняется со скоростью 3 000 очков в секунду (30 000 очков за 10 секунд)
  • Имеет максимальную емкость 300 000 очков

Это позволяет вам делать периодические скачки сложных запросов, сохраняя при этом стабильный темп запросов.

Как рассчитывается стоимость запроса 

Каждый запрос GraphQL имеет стоимость, рассчитанную перед выполнением:

Базовые стоимости

  • Query: 5 очков
  • Mutation: 10 очков
  • Object: 1 очко за каждый возвращаемый объект
  • Scalar fields: 0 очков (бесплатно)

Скалярные поля, такие как строки, целые числа, ID и логические значения, не добавляют к стоимости. Вы платите только за базовую операцию и возвращаемые объекты.

Пример: простой запрос

1query {
2 landedCost(id: "123") {
3 id
4 createdBy
5 shipToCountry
6 }
7}

Разбор стоимости: 5 (базовый запрос) + 1 (объект landed cost) = 6 очков

Скалярные поля (id, name, currency) бесплатны.

Пример: запрос с несколькими объектами

1{
2 orders(first: 10, filter: { status: COMPLETED }) {
3 edges {
4 cursor
5 node {
6 id
7 }
8 }
9 }
10}

Разбор стоимости: 5 (базовый запрос) + 10 (10 заказов × 1 очко каждый) = 15 очков

Пример: мутация

1mutation {
2 landedCostCalculate(input: { ... }) {
3 id
4 }
5}

Разбор стоимости: 10 (базовая мутация) + примерно 50 (возвращаемые объекты) = 60 очков

Типичный расчет landed cost обычно стоит около 60 очков сложности.

Просмотр сложности запроса 

Каждый ответ API включает заголовок zonos-query-complexity, показывающий стоимость вашего запроса:

1zonos-query-complexity: 58

Этот заголовок точно указывает, сколько очков потребил запрос. Используйте его для мониторинга использования API и оптимизации дорогостоящих запросов.

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

Если вы превысите ограничение скорости, вы получите сообщение об ошибке. Чтобы эффективно обрабатывать ограничения скорости:

Отслеживайте вашу сложность

Проверьте заголовок zonos-query-complexity в ответах, чтобы понять стоимость запроса и определить дорогостоящие шаблоны.

Реализуйте логику повторных попыток

Если вы достигнете ограничения скорости, реализуйте логику экспоненциальной задержки и повторных попыток. Поскольку ведро пополняется со скоростью 3 000 очков в секунду, рассчитайте соответствующие времена ожидания в зависимости от сложности вашего запроса.

Эффективно группируйте запросы

GraphQL позволяет вам запрашивать несколько запросов в одном запросе:

1{
2 landedCost(id: "landed_cost_123") {
3 id
4 createdAt
5 }
6 order(orderId: "order_123") {
7 id
8 status
9 createdAt
10 }
11}

Лучшие практики 

Запрашивайте только то, что вам нужно

Сложность запроса пропорциональна запрашиваемым данным. Структурируйте свои запросы так, чтобы получить только поля и объекты, которые вы фактически будете использовать.

1query {
2 order(orderId: "order_123") {
3 id
4 status
5 createdAt
6 updatedAt
7 items {
8 id
9 name
10 quantity
11 amount
12 }
13 shipments {
14 id
15 }
16 }
17}

Разбивайте большие наборы данных на страницы

При запросе нескольких объектов используйте разумные размеры страниц:

1{
2 orders(first: 100, filter: { status: COMPLETED }) {
3 edges {
4 cursor
5 node {
6 id
7 }
8 }
9 }
10}

Запрашивайте 10–50 элементов за раз и разбивайте результаты на страницы по мере необходимости, вместо того, чтобы запрашивать сотни объектов в одном запросе.

Избегайте ненужной вложенности

Каждый вложенный объект добавляет к вашей сложности. Запрашивайте вложенные данные только если они вам действительно нужны.

Была ли эта страница полезной?