это еще одна ошибка тайм-аута.
астое исключение, которое я получаю в журнале своего приложения ежедневно, обычно 5/6 раз в день с трафиком в 1 000 посещений в день:
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.
Функция, которая вызывает исключение выше, является следующей:
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)
В основном,store_printed_question
Функция проверяет, печатался ли данный вопрос ранее, увеличивая в этом случае соответствующий счетчик в одной транзакции.
Эта функция добавленаWebHandler
котсроченный рабочий, использующий предопределенныйпо умолчанию очередь, которая, как вы, возможно, знаете, имеет пропускную способность пяти вызовов задач в секунду.
На сущности с шестью атрибутами (двумя индексами) я подумал, что используяоперации регулирование по отложенному пределу скорости задач позволило бы мне избежать тайм-аутов хранилища данных, но, просматривая журнал, эта ошибка все еще появляется ежедневно.
Этот счетчик, который я храню, не так важен, поэтому я не беспокоюсь о получении этих таймаутов; в любом случае мне любопытно, почему Google App Engine не может правильно справиться с этой задачей даже с низкой скоростью, например, 5 задач в секунду, и если снижение скорости может быть возможным решением.
A счетчик на каждый вопрос, чтобы избежать тайм-аутов было бы излишним для меня.
РЕДАКТИРОВАТЬ:
Я установил ограничение скорости в 1 задание в секунду в очереди по умолчанию; Я все еще получаю ту же ошибку.