Warum komplexitätsbasiertes Rate-Limiting?
Herkömmliche REST APIs verwenden eine anforderungsbasierte Rate-Begrenzung, bei der jede Anfrage die gleichen Credits verbraucht, unabhängig davon, ob Sie ein Feld oder Hunderte abrufen und ob Sie Daten lesen oder ändern – trotz des erheblichen Unterschieds in der Serverlast.
Der auf Abfragekomplexität basierende Ansatz von GraphQL löst dieses Problem, indem die Kosten auf der Grundlage der tatsächlich angeforderten Daten und durchgeführten Vorgänge berechnet werden. Dies gibt Ihnen mehr Flexibilität bei der Anforderung, was Sie benötigen, und bietet gleichzeitig eine vorhersehbare Serverlast.
Rate-Limit
Zonos verwendet ein punktebasiertes System, bei dem jede Abfrage basierend auf ihrer Komplexität Punkte abzieht. Sie verfügen über einen Pool verfügbarer Punkte, die:
- Auffüllung mit 3.000 Punkten pro Sekunde (30.000 Punkte pro 10 Sekunden)
- Hat eine maximale Kapazität von 300.000 Punkten
Auf diese Weise können Sie gelegentlich komplexe Abfragen in großen Mengen durchführen und gleichzeitig ein nachhaltiges Anforderungstempo beibehalten.
So werden die Abfragekosten berechnet
Für jede GraphQL-Anfrage werden vor der Ausführung Kosten berechnet:
Grundkosten
- Query: 5 Punkte
- Mutation: 10 Punkte
- Object: 1 Punkt pro zurückgegebenem Objekt
- Scalar fields: 0 Punkte (kostenlos)
Skalare Felder wie Zeichenfolgen, Ganzzahlen, IDs und boolesche Werte erhöhen die Kosten nicht. Sie zahlen nur für den Basisbetrieb und die zurückgegebenen Objekte.
Beispiel: Einfache Abfrage
query { landedCost(id: "123") { id createdBy shipToCountry }}Kostenaufschlüsselung: 5 (Basisabfrage) + 1 (landed cost Objekt) = 6 Punkte
Die Skalarfelder (id, name, currency) sind kostenlos.
Beispiel: Abfrage mit mehreren Objekten
{ orders(first: 10, filter: { status: COMPLETED }) { edges { cursor node { id } } }}Kostenaufschlüsselung: 5 (Basisabfrage) + 10 (10 Bestellungen × je 1 Punkt) = 15 Punkte
Beispiel: Mutation
mutation { landedCostCalculate(input: { ... }) { id }}Aufschlüsselung der Kosten: 10 (Basismutation) + ca. 50 (zurückgegebene Objekte) = 60 Punkte
Eine typische landed cost-Berechnung kostet etwa 60 Punkte an Komplexität.
Abfragekomplexität anzeigen
Jede API-Antwort enthält einen zonos-query-complexity-Header mit den Kosten Ihrer Anfrage:
zonos-query-complexity: 58In diesem Header erfahren Sie genau, wie viele Punkte die Abfrage verbraucht hat. Verwenden Sie es, um Ihre API-Nutzung zu überwachen und teure Abfragen zu optimieren.
Umgang mit Rate-Limits
Wenn Sie Ihr Rate-Limit überschreiten, erhalten Sie eine Fehlermeldung. Um Rate-Limits effektiv zu handhaben:
Überwachen Sie Ihre Komplexität
Überprüfen Sie den zonos-query-complexity-Header in den Antworten, um Ihre Abfragekosten zu verstehen und teure Muster zu erkennen.
Wiederholungslogik implementieren
Wenn Sie Rate-Limits erreichen, implementieren Sie exponentielle Backoff- und Wiederholungslogik. Da der Bucket mit 3.000 Punkten pro Sekunde wieder aufgefüllt wird, berechnen Sie geeignete Wartezeiten basierend auf der Komplexität Ihrer Abfrage.
Effizient bündeln
Mit GraphQL können Sie mehrere Abfragen in einer einzigen Anfrage anfordern:
{ landedCost(id: "landed_cost_123") { id createdAt } order(orderId: "order_123") { id status createdAt }}Best Practices
Fordern Sie nur das an, was Sie brauchen
Die Komplexität der Abfrage ist proportional zu den von Ihnen angeforderten Daten. Strukturieren Sie Ihre Abfragen so, dass nur die Felder und Objekte abgerufen werden, die Sie tatsächlich verwenden.
query { order(orderId: "order_123") { id status createdAt updatedAt items { id name quantity amount } shipments { id } }}Große Datensätze paginieren
Wenn Sie mehrere Objekte anfordern, verwenden Sie angemessene Seitengrößen:
{ orders(first: 100, filter: { status: COMPLETED }) { edges { cursor node { id } } }}Fordern Sie 10–50 Elemente gleichzeitig an und paginieren Sie die Ergebnisse nach Bedarf, anstatt Hunderte von Objekten in einer einzigen Abfrage anzufordern.
Unnötige Verschachtelung vermeiden
Jedes verschachtelte Objekt erhöht Ihre Komplexität. Fordern Sie verschachtelte Daten nur dann an, wenn Sie sie tatsächlich benötigen.
GraphQL API Rate-Limiting
Erfahren Sie, wie Zonos die Abfragekosten basierend auf der Komplexität berechnet.
Zonos begrenzt GraphQL-API-Anfragen basierend auf der Komplexität der Abfrage und nicht auf der Anzahl der Anfragen. Dies stellt eine faire Nutzung sicher und ermöglicht Ihnen gleichzeitig, genau die Daten anzufordern, die Sie benötigen.