Zum Inhalt springen

API-Drosselung

Mirakl-Marktplätze schützen ihre APIs durch Aufrufgrenzen (Rate Limits). Wenn Sie in kurzer Zeit zu viele Aufrufe absetzen, antwortet der Marktplatz mit einer Rate-Limit-Meldung und bittet darum zu warten. Das Plugin behandelt das auf zwei Wegen: Es verteilt seine eigenen ausgehenden Aufrufe für die drei großen Importflüsse zeitlich, und es zieht sich zurück und wiederholt, wenn der Marktplatz darum bittet.

Sie müssen nichts tun, damit das funktioniert — es geschieht automatisch. Diese Seite erklärt, was im Hintergrund passiert, damit Sie es in den Sync Logs erkennen, wenn eine Synchronisation ungewöhnlich langsam erscheint.

Das Plugin erzwingt eine Minute Abstand zwischen seinen eigenen Aufrufen in drei Importflüssen, je Marktplatz:

  • Produktimporte — die Aufrufe, die Produkte in den Marktplatzkatalog hochladen.
  • Angebotsimporte — die Aufrufe, die Angebote (Preis und Bestand für ein gegebenes Produkt) hochladen.
  • Bestandsimporte — die Aufrufe, die ausschließlich Bestandsaktualisierungen senden.

Diese drei Gruppen sind unabhängig voneinander. Eine Pause bei den Angebotsimporten blockiert die Bestandsimporte oder Produktimporte nicht.

Alles andere — Bestellimport, Nachrichten-, Dokument-, Rechnungs- und Transaktionsprotokoll-Synchronisation — verwendet diese Verteilung nicht. Diese Abläufe verlassen sich allein auf die Rate-Limit-Antwort des Marktplatzes (siehe unten).

Wenn das Plugin einen der verteilten Aufrufe senden möchte und der vorherige Aufruf zur selben Gruppe weniger als 60 Sekunden zurückliegt, wird der Aufruf um 60 Sekunden verschoben. Das Plugin wartet nicht aktiv — es legt die Nachricht mit Verzögerung zurück in die Warteschlange, lässt den Hintergrundprozess andere Arbeit erledigen und nimmt die Nachricht später wieder auf.

Was Sie sehen werden:

  • In den Sync Logs kann ein Lauf von Stock sync oder Product export, der normalerweise einige Minuten dauert, sich verlängern, während das Plugin seine Aufrufe verteilt.
  • Der Zähler Processed steigt stetig, nur langsamer als die Wanduhr.
  • Keine Charge wird verworfen — der eventuelle Abschluss ist garantiert.

Was passiert, wenn der Marktplatz „Rate Limit” sagt

Abschnitt betitelt „Was passiert, wenn der Marktplatz „Rate Limit” sagt“

Wenn der Marktplatz selbst mit einer Rate-Limit-Antwort (HTTP-Status 429) antwortet, teilt er dem Plugin im Header Retry-After mit, wie lange es warten soll. Das Plugin hält sich daran: Es legt die Nachricht mit genau dieser Verzögerung zurück in die Warteschlange und lässt den Hintergrundprozess andere Arbeit erledigen.

Der Wiederholungspfad ist für jede Art von Synchronisation derselbe — sowohl für verteilte als auch für nicht verteilte Abläufe. Sie sehen eine Sync-Log-Zeile mit dem Rate-Limit-Text des Marktplatzes im Feld Message. Der nächste Versuch wird automatisch aufgenommen, sobald die Verzögerung abgelaufen ist.

Das einfachste Signal steht in den Sync Logs:

  • Ein Lauf von Stock sync, Product export batch oder Offer sync im Status started, der merklich länger dauert als üblich, mit langsam steigendem Processed-Zähler — das ist das Plugin, das seine Aufrufe verteilt.
  • Eine Zeile auf Stufe warning oder error mit einer Nachricht, die das Rate Limit des Marktplatzes erwähnt — das ist der Marktplatz, der zurückdrückt. Der nächste Versuch läuft automatisch nach der zurückgegebenen Verzögerung.

Wenn Sie ständige Rate-Limit-Meldungen für Abläufe sehen, die nicht verteilt werden (Bestellimport, Nachrichten-, Dokument-, Rechnungs-, Transaktionsprotokoll-Synchronisation), besteht die Lösung darin, das entsprechende Intervall auf dem Reiter Mirakl → Einstellungen → Synchronisierungseinstellungen zu reduzieren — siehe Einstellungen.

Wenn Sie mehrere Shopware-Hosts mit Hintergrundprozessen betreiben, die denselben Marktplatz ansprechen, verteilt jeder Host seine Aufrufe standardmäßig unabhängig — sie wissen nichts von den Aufrufen der anderen. Für eine kleine Flotte ist das in der Regel ausreichend, weil das Rate Limit des Marktplatzes Überschreitungen ohnehin abfängt. Für größere Aufstellungen konfigurieren Sie einen gemeinsamen Lock-Store (Redis oder Doctrine) für Symfony Lock, damit die Hosts sich abstimmen.