DOCS

GraphQL API rate limiting

GraphQL API rate limiting

Lær, hvordan Zonos beregner query-omkostninger baseret på kompleksitet.

Zonos rate-limiter GraphQL API-anmodninger baseret på query-kompleksitet frem for antal anmodninger. Det sikrer fair brug, samtidig med at du kan anmode om præcis de data, du har brug for.

Hvorfor kompleksitetsbaseret rate limiting? 

Traditionelle REST API'er bruger anmodningsbaseret rate limiting, hvor hver anmodning forbruger de samme credits — uanset om du henter ét felt eller hundredvis, og uanset om du læser eller ændrer data — på trods af den betydelige forskel i serverbelastning.

GraphQLs kompleksitetsbaserede tilgang løser dette ved at beregne omkostninger baseret på de faktiske data, der anmodes om, og de operationer, der udføres. Det giver dig mere fleksibilitet til at anmode om det, du har brug for, samtidig med at serverbelastningen forbliver forudsigelig.

Rate limit 

Zonos bruger et pointbaseret system, hvor hver query trækker point baseret på sin kompleksitet. Du har en pulje af tilgængelige point, der:

  • Genopfyldes med 3.000 point pr. sekund (30.000 point pr. 10 sekunder)
  • Har en maksimal kapacitet på 300.000 point

Det gør det muligt at foretage lejlighedsvise bursts af komplekse queries, samtidig med at du opretholder et bæredygtigt anmodningstempo.

Sådan beregnes query-omkostninger 

Hver GraphQL-anmodning har en omkostning, der beregnes før udførelse:

Basisomkostninger

  • Query: 5 point
  • Mutation: 10 point
  • Object: 1 point pr. returneret objekt
  • Scalar fields: 0 point (gratis)

Scalar fields som strings, integers, ID'er og booleans bidrager ikke til omkostningen. Du betaler kun for basisoperationen og de returnerede objekter.

Eksempel: Simpel query

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

Omkostningsfordeling: 5 (basis-query) + 1 (landed cost-objekt) = 6 point

Scalar fields (id, name, currency) er gratis.

Eksempel: Query med flere objekter

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

Omkostningsfordeling: 5 (basis-query) + 10 (10 ordrer × 1 point hver) = 15 point

Eksempel: Mutation

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

Omkostningsfordeling: 10 (basis-mutation) + ca. 50 (returnerede objekter) = 60 point

En typisk landed cost-beregning koster omkring 60 point i kompleksitet.

Visning af query-kompleksitet 

Hvert API-svar inkluderer en zonos-query-complexity-header, der viser din query-omkostning:

1zonos-query-complexity: 58

Denne header fortæller dig præcis, hvor mange point queryen forbrugte. Brug den til at overvåge din API-brug og optimere dyre queries.

Håndtering af rate limits 

Hvis du overskrider dit rate limit, modtager du en fejlmeddelelse. For at håndtere rate limits effektivt:

Overvåg din kompleksitet

Tjek zonos-query-complexity-headeren i svar for at forstå dine query-omkostninger og identificere dyre mønstre.

Implementer retry-logik

Hvis du rammer rate limits, skal du implementere exponential backoff og retry-logik. Da puljen genopfyldes med 3.000 point pr. sekund, skal du beregne passende ventetider baseret på din query-kompleksitet.

Batch effektivt

GraphQL gør det muligt at anmode om flere queries i en enkelt anmodning:

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}

Bedste praksis 

Anmod kun om det, du har brug for

Query-kompleksitet er proportional med de data, du anmoder om. Strukturer dine queries, så de kun henter de felter og objekter, du faktisk bruger.

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}

Paginer store datasæt

Når du anmoder om flere objekter, skal du bruge rimelige sidestørrelser:

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

Anmod om 10-50 elementer ad gangen, og paginer gennem resultater efter behov, frem for at anmode om hundredvis af objekter i en enkelt query.

Undgå unødvendig indlejring

Hvert indlejret objekt bidrager til din kompleksitet. Anmod kun om indlejrede data, når du faktisk har brug for dem.

Book en demo

Var denne side nyttig?