Тайм-аут Google App Engine: истекло время работы хранилища данных или данные были временно недоступны

Это обычное исключение, которое я получаю в журнале приложения ежедневно, обычно 5/6 раз в день с трафиком 1000 посещений в день:

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 задач в секунду, и если снижение скорости может быть возможным решением.
сегментированный счетчик для каждого вопроса во избежание тайм-аутов был бы для меня излишним.

РЕДАКТИРОВАТЬ:
Я установил ограничение скорости на 1 задачу в секунду в очереди по умолчанию; Я все еще получаю ту же ошибку.

11
задан systempuntoout 21 January 2011 в 10:49
поделиться