Hallo zusammen,
könnt ihr euch denken, die Wartezeiten zwischen API-Abrufen dynamisch steuerbar zu machen? Beispielsweise bei Shopify-GraphQL kriegt man ja sehr genau genannt, wieviele Api-Punkte noch zur Verfügung stehen und soll dort ja eigentlich proaktiv auf einen Mangel an Punkten reagieren.
Eigentlich wäre das „einfach nur“ ein zusätzlicher Parameter bei der nextURL-Funktion, in dem man die Wartezeit angeben kann. Grade wenn es in Richtung geschachtelte Abfragen geht, macht ein fix gesetztes Ratelimit wie in euren API-Steps üblich, nur sehr wenig Sinn. 250 Bestellungen abrufen kann man vielleicht 2-mal die Sekunde machen, 10 weitere Bestellpositionen zu einer gegebenen Bestellung abrufen aber 20-mal.
Die Problematik im Moment ist, dass die GraphQL-API ja immer eine 200er Antwort gibt. Wenn man also z.B. die Produktdaten abruft und das Ratelimit ist nicht großzügig genug eingestellt, passiert folgendes:
Man ruft eine Seite ab und Shopify liefert einen Cursor zurück, den man für den nächsten Aufruf benutzt. Das wiederholt man 10 mal, soweit so gut. Beim 11ten Aufruf greift das Ratelimit, Shopify liefert weiterhin eine 200er Antwort. Aber in der Payload sind keine Produkte mehr oder Cursor für die nächste Seite, sondern nur noch ein Hinweis „Dududu, warte mal bis deine Api Punkte regeneriert sind“. Der Parsing-Code bricht also ab, weil kein Cursor mehr vorhanden und der Flow läuft erfolgreich weiter mit den Daten aus 10 Seiten Produkten. Es gab aber insgesamt 25 Seiten mit Produkten.
Hier das ganze noch als Graph, wie sich die API-Punkte über meine 700 Produktabrufcalls verhält.
In der Zeit, wo der Graph bei 2000 dümpelt, kostet eine Request 12 Punkte. Da könnte ich dauerhaft 8 Calls die Sekunde machen. Aber weil mit 8 Calls der Dip am Anfang unter 0 fallen würde, muss ich alles mit 1.5 Calls die Sekunde machen.
Alternativ zu einem bessere steuerbaren Ratelimit könnte ich in meinem Parsing-Template auch auf den Ratelimit-Hinweis von Shopify reagieren und anschließend eine Handvoll an Requests an einen Dummy-Server schicken, welcher mit leere Body antwortet. So lasse ich den Shopify-Server für 4-5 Requests in Frieden und regeneriert API-Punkte. Die Lösung für euch aber wahrscheinlich ähnlich zufriedenstellend wie für mich
.
Gruß
Gustav
