2

Rückkehr ich Python haben einen Prozess Leasing Aufgaben aus dem Google TaskQueue REST API jede Sekunde in die unbegrenzte Schleife:Google Task Queue Restzug 500 gelegentlich

credentials = GoogleCredentials.get_application_default() 
task_api = googleapiclient.discovery.build('taskqueue', 'v1beta2', credentials=credentials) 
while True: 
    tasks = task_api.tasks().lease(...).execute() 
    time.sleep(1) 

Der Prozess manchmal auch stundenlang laufen. Aber gelegentlich stürzt oft von einem HTTP-Fehler:

  • 500 Backend Fehler
  • 503 Backend Fehler
  • 500 ist ein interner Fehler im Backend passiert

Der Prozess auf dem Google Computing läuft Engine-Server Es verwendet einen Dienstkontoschlüssel, der von der Variablen GOOGLE_APPLICATION_CREDENTIALS env angegeben wird. Ist das ein Google Task Queue Bug oder vermisse ich etwas? Z.B. Muss ich die Anmeldedaten vor jeder Lease-Anfrage erneut lesen?

+1

Backend-Fehler ist Hochwasserschutz google empfiehlt die Implementierung eines exponentiellen Backoff. – DaImTo

+0

@Dalmto können Sie einen Link zu einer Dokumentation veröffentlichen? – xmedeko

+1

Sie zwei haben die Macht der Google-Suche. Google-Fehler sind systemweit gut für alle APIs https://developers.google.com/drive/v3/web/handle-errors#500_backend_error – DaImTo

Antwort

2

Da der @Dalmto gerade in Kommentaren geantwortet hat, fasse ich seine Antworten zusammen und füge die Python-Lösung hinzu.

Der von Google 5xx unterstützte Fehler ist ein Hochwasserschutz und Google empfiehlt, exponential backoff zu implementieren. Trotz der Links, die auf Google Drive API verweisen, sind die Google-Fehler systemweit für alle APIs (einschließlich GAE) gültig. Es dauert selten mehr als 6 Wiederholungen, damit es eingreift und reagiert.

Nachdem die googleapiclient Quellen zu graben, ich habe festgestellt, dass die exponentielle Backoff bereits in dieser Bibliothek implementiert, so dass die Lösung ist tot einfach:

tasks = task_api.tasks().lease(...).execute(num_retries=6) 

Die Quellen des http.py::_should_retry_response() zeigt, dass neben HTTP 5xx Fehler Die Anforderung wird auch wiederholt, wenn die JSON-Antwort userRateLimitExceeded oder rateLimitExceeded Fehler enthält.