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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Abfrage kann nur Leben, für 30 Sekunden. Siehe meine Antwort auf diese Frage für einige Beispiel-code zu brechen, eine Abfrage mit Cursor.
appengine.Timeout
jetztcontext.WithTimeout
Generell ein Zeitlimit wie dies in der Regel, weil der schreiben Sie Streit. Wenn Sie haben eine Transaktion geht und schreiben Sie ein paar Sachen zu der gleichen Einheit Gruppe gleichzeitig führen Sie in schreiben Konflikte Probleme (eine Nebenwirkung von vollständige Parallelität). In den meisten Fällen, wenn Sie Ihre entity group kleiner, das wird in der Regel minimieren dieses problem.
In Ihrem speziellen Fall, basierend auf dem code von oben, es ist wahrscheinlich, weil Sie sollten eine sharded-Zähler zu vermeiden, stapeln von serialisierten schreibt.
Andere, weit weniger wahrscheinliche Möglichkeit (erwähnt werden hier nur der Vollständigkeit halber) ist, dass die Tablette Ihre Daten auf verschoben.