Aller au contenu principal

Fehler QuotaError.EXCEEDED_QUOTA in der Google Ad Manager API beheben

Erfahren Sie, warum Ihre SOAP- oder REST-Anfragen aufgrund der Ratenbegrenzung von Google fehlschlagen und wie Sie eine robuste clientseitige Backoff- und Drosselungsstrategie implementieren.

OA
OrbiAds Engineering
Publié le 27 mai 2026 · Lecture 6 min

Warum tritt dieser Fehler auf?

Die Google Ad Manager (GAM) API erzwingt strenge Grenzwerte für die Anzahl der Anfragen, die ein Netzwerk oder ein Service-Account innerhalb eines bestimmten Zeitfensters (normalerweise berechnet pro Sekunde und pro Minute) stellen kann. Wenn Ihre Skripte oder KI-Agenten diese Ratenbegrenzungen überschreiten, wirft die API sofort einen QuotaError.EXCEEDED_QUOTA (in SOAP) oder einen HTTP-Code 429 Too Many Requests (in REST).

Diese Quoten variieren erheblich, je nachdem, ob Sie ein Google Ad Manager Standard-Netzwerk oder ein Premium-Konto von Google Ad Manager 360 verwenden. Bei Standard-Netzwerken ist das Limit für Anfragen pro Sekunde recht niedrig, sodass es bei Massenoperationen oder dem Abrufen großer Analyseberichte sehr leicht ausgelöst werden kann.

Achtung bei parallelen Anfragen

Wenn Sie mehrere Skripte oder Backend-Funktionen (wie parallele Cloud Run-Aufgaben) mit denselben Service-Account-Zugangsdaten ausführen, wird deren API-Nutzung aggregiert. Dies ist die häufigste Ursache für intermittierende Quotenfehler in der Produktion.

Struktur des SOAP-XML-Fehlers

Bei SOAP-API-Aufrufen wird der Fehler innerhalb eines SoapFault-Elements zurückgegeben. Die Überprüfung Ihrer Debug-Protokolle zeigt normalerweise eine Struktur wie diese:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <soap:Fault>
      <faultcode>soap:Server</faultcode>
      <faultstring>[QuotaError.EXCEEDED_QUOTA @ ]</faultstring>
      <detail>
        <ApiExceptionFault xmlns="https://www.google.com/apis/ads/publisher/v202605">
          <message>[QuotaError.EXCEEDED_QUOTA @ ]</message>
          <errors xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="QuotaError">
            <fieldPath></fieldPath>
            <trigger></trigger>
            <errorString>QuotaError.EXCEEDED_QUOTA</errorString>
            <reason>EXCEEDED_QUOTA</reason>
          </errors>
        </ApiExceptionFault>
      </detail>
    </soap:Fault>
  </soap:Body>
</soap:Envelope>

Behebung des Fehlers: Implementierung von exponentiellem Backoff

Die offizielle Empfehlung von Google für Entwickler lautet, diesen spezifischen Fehler abzufangen und die Anfrage nach einer berechneten Verzögerung erneut zu versuchen. Die Verzögerung sollte mit jedem nachfolgenden Fehler exponentiell ansteigen, um eine Verschlimmerung der API-Last zu verhindern (ein Phänomen namens Retry-Storm).

Hier ist eine saubere Python-Implementierung, um Ihre GAM-Dienstaufrufe mit exponentiellem Backoff und zufälligem Jitter zu versehen:

import time
import random
from googleads import errors

def execute_with_backoff(api_call_func, max_retries=5):
    base_delay = 1.0  # Startverzögerung in Sekunden
    
    for attempt in range(max_retries):
        try:
            return api_call_func()
        except errors.GoogleAdsSoapResponseError as e:
            # Überprüfung auf QuotaError.EXCEEDED_QUOTA in der Fehlerliste
            is_quota_error = any(
                getattr(error, 'reason', '') == 'EXCEEDED_QUOTA'
                for error in e.detail.errors
            )
            
            if is_quota_error and attempt < max_retries - 1:
                # Wartezeit berechnen: base_delay * 2^attempt + jitter
                delay = base_delay * (2 ** attempt) + random.uniform(0, 1.0)
                print(f"Quote überschritten. Versuch {attempt + 1}/{max_retries}. Pause von {delay:.2f}s...")
                time.sleep(delay)
                continue
                
            raise e  # Fehler erneut werfen, wenn es ein anderer Fehler ist oder Versuche erschöpft sind

Die Grenzen der prozesslokalen Drosselung

Während das obige Code-Snippet für eigenständige Skripte mit einem einzigen Thread perfekt funktioniert, stößt es in modernen verteilten Webarchitekturen an seine Grenzen. Wenn Sie Ihre AdOps-Plattform auf Google Cloud Run ausführen oder mehrere autonome KI-Agenten gleichzeitig orchestrieren, ist eine prozesslokale Speicher-Drosselung unzureichend.

Wenn 10 separate Serverless-Container gleichzeitig hochskalieren, teilen sie ihren lokalen Ausführungsstatus nicht. Sie werden die Endpunkte von Google weiterhin gleichzeitig bombardieren, was zu einer dauerhaften Sperrung führt. Um dies zu lösen, müssen Entwickler API-Sperren über ein transaktionales Backend oder eine zentrale Cache-Schicht wie Redis koordinieren.