DOCS

Ograniczanie szybkości GraphQL API

Ograniczanie szybkości GraphQL API

Dowiedz się, jak Zonos oblicza koszty zapytań na podstawie złożoności.

Zonos ogranicza żądania GraphQL API na podstawie złożoności zapytania, a nie liczby żądań. To zapewnia uczciwe użytkowanie, jednocześnie pozwalając Ci zażądać dokładnie potrzebnych danych.

Dlaczego ograniczanie szybkości na podstawie złożoności? 

Tradycyjne interfejsy API REST używają ograniczania szybkości na podstawie liczby żądań, gdzie każde żądanie zużywa takie same kredyty, niezależnie od tego, czy pobierasz jedno pole czy setki, czy odczytujesz czy modyfikujesz dane — pomimo znacznej różnicy w obciążeniu serwera.

Podejście GraphQL oparte na złożoności zapytań rozwiązuje ten problem, obliczając koszty na podstawie faktycznie żądanych danych i wykonywanych operacji. To daje Ci większą elastyczność w żądaniu potrzebnych informacji, jednocześnie zapewniając przewidywalne obciążenie serwera.

Limit szybkości 

Zonos używa systemu opartego na punktach, gdzie każde zapytanie odejmuje punkty na podstawie jego złożoności. Masz pulę dostępnych punktów, które:

  • Są uzupełniane z szybkością 3 000 punktów na sekundę (30 000 punktów na 10 sekund)
  • Mają maksymalną pojemność 300 000 punktów

To pozwala Ci na okazjonalne skoki liczby złożonych zapytań przy jednoczesnym utrzymaniu zrównoważonego tempa żądań.

Jak obliczany jest koszt zapytania 

Każde żądanie GraphQL ma koszt obliczony przed wykonaniem:

Koszty podstawowe

  • Query: 5 punktów
  • Mutation: 10 punktów
  • Object: 1 punkt na zwrócony obiekt
  • Scalar fields: 0 punktów (bezpłatnie)

Pola skalarne takie jak ciągi znaków, liczby całkowite, identyfikatory i wartości logiczne nie zwiększają kosztu. Płacisz tylko za operację podstawową i zwrócone obiekty.

Przykład: Proste zapytanie

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

Podział kosztów: 5 (podstawowe zapytanie) + 1 (obiekt kosztu dostawy) = 6 punktów

Pola skalarne (id, name, currency) są bezpłatne.

Przykład: Zapytanie z wieloma obiektami

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

Podział kosztów: 5 (podstawowe zapytanie) + 10 (10 zamówień × 1 punkt każde) = 15 punktów

Przykład: Mutacja

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

Podział kosztów: 10 (mutacja podstawowa) + około 50 (zwrócone obiekty) = 60 punktów

Typowe obliczenie kosztu dostawy kosztuje około 60 punktów w złożoności.

Wyświetlanie złożoności zapytania 

Każda odpowiedź API zawiera nagłówek zonos-query-complexity pokazujący koszt Twojego zapytania:

1zonos-query-complexity: 58

Ten nagłówek mówi Ci dokładnie ile punktów zapytanie zużyło. Użyj go do monitorowania użytkowania API i optymalizacji kosztownych zapytań.

Obsługa limitów szybkości 

Jeśli przekroczysz limit szybkości, otrzymasz komunikat o błędzie. Aby efektywnie obsługiwać limity szybkości:

Monitoruj swoją złożoność

Sprawdź nagłówek zonos-query-complexity w odpowiedziach, aby zrozumieć koszty zapytań i zidentyfikować kosztowne wzorce.

Wdróż logikę ponowienia

Jeśli osiągniesz limity szybkości, wdróż logikę exponential backoff i ponowienia. Ponieważ pula punktów uzupełnia się z szybkością 3 000 punktów na sekundę, oblicz odpowiednie czasy oczekiwania na podstawie złożoności zapytania.

Grupuj efektywnie

GraphQL pozwala Ci na żądanie wielu zapytań w jednym żądaniu:

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}

Najlepsze praktyki 

Żądaj tylko to, czego potrzebujesz

Złożoność zapytania jest proporcjonalna do danych, które żądasz. Strukturuj swoje zapytania, aby pobrać tylko pola i obiekty, które faktycznie będziesz używać.

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}

Paginacja dużych zbiorów danych

Kiedy żądasz wielu obiektów, używaj rozsądnych rozmiarów stron:

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

Żądaj 10-50 elementów na raz i przechodź przez wyniki w miarę potrzeby, zamiast żądać setek obiektów w jednym zapytaniu.

Unikaj niepotrzebnego zagnieżdżenia

Każdy zagnieżdżony obiekt zwiększa Twoją złożoność. Żądaj tylko zagnieżdżonych danych, gdy ich rzeczywiście potrzebujesz.

Czy ta strona była pomocna?