Google App Engine timeout: Der datastore operation timed out, oder die Daten vorübergehend nicht zur Verfügung

Dies ist eine häufige Ausnahme, ich bin immer auf meine Anwendung log-täglich, in der Regel 5/6 mal am Tag mit einem traffic von 1K visits/Tag:

db error trying to store stats
Traceback (most recent call last):
  File "/base/data/home/apps/stackprinter/1b.347728306076327132/app/utility/worker.py", line 36, in deferred_store_print_statistics
    dbcounter.increment()
  File "/base/data/home/apps/stackprinter/1b.347728306076327132/app/db/counter.py", line 28, in increment
    db.run_in_transaction(txn)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 1981, in RunInTransaction
    DEFAULT_TRANSACTION_RETRIES, function, *args, **kwargs)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 2067, in RunInTransactionCustomRetries
    ok, result = _DoOneTry(new_connection, function, args, kwargs)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 2105, in _DoOneTry
    if new_connection.commit():
  File "/base/python_runtime/python_lib/versions/1/google/appengine/datastore/datastore_rpc.py", line 1585, in commit
    return rpc.get_result()
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 530, in get_result
    return self.__get_result_hook(self)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/datastore/datastore_rpc.py", line 1613, in __commit_hook
    raise _ToDatastoreError(err)
Timeout: The datastore operation timed out, or the data was temporarily unavailable.

Die Funktion, die Anhebung der Ausnahme oben ist das folgende:

def store_printed_question(question_id, service, title):
    def _store_TX():
        entity = Question.get_by_key_name(key_names = '%s_%s' % \
                                         (question_id, service ) )
        if entity:
            entity.counter = entity.counter + 1                
            entity.put()
        else:
            Question(key_name = '%s_%s' % (question_id, service ),\ 
                          question_id ,\
                          service,\ 
                          title,\ 
                          counter = 1).put()
    db.run_in_transaction(_store_TX)

Grundsätzlich die store_printed_question - Funktion überprüfen, ob eine bestimmte Frage, die bereits gedruckt wurde, erhöht in diesem Fall die zugehörige Schalter in einer einzigen Transaktion.

Diese Funktion wird Hinzugefügt, indem eine WebHandler zu einem latente Arbeiter mit Hilfe der vordefinierten Standard Warteschlange, die, wie Sie vielleicht wissen, hat eine Durchlaufgeschwindigkeit von fünf task-Aufrufe pro Sekunde.

Auf eine Entität mit sechs Parametern (zwei Indizes) dachte ich das Transaktionen geregelt ist, durch einen verzögerten task-limit würde mir erlauben, zu vermeiden datastore-timeouts aber mit Blick auf das log dieses Fehlers wird noch zeigen, bis täglich.

Diesem Zähler bin ich die Speicherung ist nicht so sehr wichtig, so bin ich nicht besorgt über die immer diese timeouts; trotzdem bin ich neugierig, warum Google App Engine nicht verarbeiten kann diese Aufgabe auch korrekt, bei einer niedrigen rate, wie 5 Aufgaben pro Sekunde und wenn die Senkung der rate könnte eine mögliche Lösung.

Ein sharded-Zähler auf die jeweilige Frage, um Zeitüberschreitungen zu vermeiden wäre ein overkill für mich.

EDIT:

Ich habe das limit 1 Aufgabe pro Sekunde auf die Standard-Warteschlange; ich bin noch immer der gleiche Fehler.

  • Zurückgestellte Aufgaben nicht "leichter" als die normalen Aufgaben, die in irgendeinem Sinn, außer, dass Sie einfacher zu schreiben. Unter der Haube, Sie sind umgesetzt mit regelmäßigen Handler. Auf jeden Fall, dass hätte keine Auswirkungen auf den Verwaltungsaufwand der Transaktion selbst.
Schreibe einen Kommentar