DOCS

GraphQL API Rate-Limiting

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.

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

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

Kostenaufschlüsselung: 5 (Basisabfrage) + 1 (landed cost Objekt) = 6 Punkte

Die Skalarfelder (id, name, currency) sind kostenlos.

Beispiel: Abfrage mit mehreren Objekten

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

Kostenaufschlüsselung: 5 (Basisabfrage) + 10 (10 Bestellungen × je 1 Punkt) = 15 Punkte

Beispiel: Mutation

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

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:

1zonos-query-complexity: 58

In 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:

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}

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.

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}

Große Datensätze paginieren

Wenn Sie mehrere Objekte anfordern, verwenden Sie angemessene Seitengrößen:

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

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.

War diese Seite hilfreich?