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
query { landedCost(id: "123") { id createdBy shipToCountry }}Omkostningsfordeling: 5 (basis-query) + 1 (landed cost-objekt) = 6 point
Scalar fields (id, name, currency) er gratis.
Eksempel: Query med flere objekter
{ orders(first: 10, filter: { status: COMPLETED }) { edges { cursor node { id } } }}Omkostningsfordeling: 5 (basis-query) + 10 (10 ordrer × 1 point hver) = 15 point
Eksempel: Mutation
mutation { landedCostCalculate(input: { ... }) { id }}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:
zonos-query-complexity: 58Denne 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:
{ landedCost(id: "landed_cost_123") { id createdAt } order(orderId: "order_123") { id status createdAt }}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.
query { order(orderId: "order_123") { id status createdAt updatedAt items { id name quantity amount } shipments { id } }}Paginer store datasæt
Når du anmoder om flere objekter, skal du bruge rimelige sidestørrelser:
{ orders(first: 100, filter: { status: COMPLETED }) { edges { cursor node { id } } }}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.
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.