appengine запускает неудачные задачи дважды, даже если task_retry_limit=0

Я вижу ошибочное поведение в API очереди задач. Когда задача терпит неудачу, appengine всегда запускает ее еще раз, даже если я говорю не делать этого.

Это соответствующий код:

NO_RETRY = TaskRetryOptions(task_retry_limit=0)


class EnqueueTaskDapau(webapp2.RequestHandler):
    def get(self):
        taskqueue.add(
            url='/task_dapau',
            queue_name='DEFAULT',
            retry_options=NO_RETRY
        )


class TaskDapau(webapp2.RequestHandler):
    def get(self):
        logging.warning('Vai dar pau')
        raise BaseException('Deu pau :-)')

    def post(self):
        return self.get()


application = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/enqueue_dapau', EnqueueTaskDapau),
    ('/task_dapau', TaskDapau),
], debug=True)

Все приложение доступно на Github, поэтому его должно быть легко воспроизвести. Когда я указываю браузеру на /enqueue_dapau, вот что я вижу в журналах (в веб-консоли):

2014-10-30 08:31:01.054 /task_dapau 500 4ms 0kb AppEngine-Google; (+http://code.google.com/appengine) module=default version=1
W 2014-10-30 08:31:01.052 Vai dar pau
E 2014-10-30 08:31:01.053 Traceback (most recent call last): File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 267, in

2014-10-30 08:31:00.933 /task_dapau 500 3ms 0kb AppEngine-Google; (+http://code.google.com/appengine) module=default version=1
W 2014-10-30 08:31:00.931 Vai dar pau
E 2014-10-30 08:31:00.932 Traceback (most recent call last): File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 267, in

2014-10-30 08:31:00.897 /enqueue_dapau 200 91ms 0kb Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36 module=default version=1

Если я посмотрю на очереди задач в веб-консоли, я увижу «Выполнить в последнюю минуту == 2». Это поведение отличается от того, что я получаю локально с помощью SDK:

INFO     2014-10-30 15:49:05,711 module.py:666] default: "GET /enqueue_dapau HTTP/1.1" 200 -
WARNING  2014-10-30 15:49:05,729 views.py:33] Vai dar pau
ERROR    2014-10-30 15:49:05,729 wsgi.py:279] 
Traceback (most recent call last):
  File "/home/tony/google_appengine/google/appengine/runtime/wsgi.py", line 267, in Handle
    result = handler(dict(self._environ), self._StartResponse)
  File "/home/tony/google_appengine/lib/webapp2-2.3/webapp2.py", line 1505, in __call__
    rv = self.router.dispatch(request, response)
  File "/home/tony/google_appengine/lib/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/home/tony/google_appengine/lib/webapp2-2.3/webapp2.py", line 1077, in __call__
    return handler.dispatch()
  File "/home/tony/google_appengine/lib/webapp2-2.3/webapp2.py", line 545, in dispatch
    return method(*args, **kwargs)
  File "/home/tony/work/qmag/gaetests/src/views.py", line 37, in post
    return self.get()
  File "/home/tony/work/qmag/gaetests/src/views.py", line 34, in get
    raise BaseException('Deu pau :-)')
BaseException: Deu pau :-)
INFO     2014-10-30 15:49:05,735 module.py:666] default: "POST /task_dapau HTTP/1.1" 500 -
WARNING  2014-10-30 15:49:05,735 taskqueue_stub.py:1986] Task task4 failed to execute. The task has no remaining retries. Failing permanently after 0 retries and 0 seconds

Это ошибка? (Это действительно так выглядит)

Есть ли простой обходной путь для этого?


person Tony Lâmpada    schedule 30.10.2014    source источник
comment
Сообщили об ошибке в своем трекере — code.google.com/p/googleappengine. /issues/detail?id=11425   -  person Tony Lâmpada    schedule 30.10.2014
comment
Связано: stackoverflow. ком/вопросы/5505416/   -  person Tony Lâmpada    schedule 30.10.2014


Ответы (3)


Как упоминается в документации, App Engine иногда запускает задание дважды. Вы должны написать свои задачи, чтобы гарантировать, что это не будет вредным.

person David    schedule 30.10.2014
comment
Гус спасибо! Они должны упомянуть это очень близко к тому месту, где они говорят, что должна была делать 'task_retry_limit' ›:| - person Tony Lâmpada; 31.10.2014

Я только что нашел способ избежать нежелательной повторной попытки:

taskqueue.add(
    url='/blah',
    queue_name='myq',
    retry_options=TaskRetryOptions(task_retry_limit=0, task_age_limit=1),
    countdown=1,
)

Эта комбинация retry_limit, age_limit и обратного отсчета является волшебным заклинанием, которое делает свое дело.

Однако это все еще неоптимально, поэтому я оставлю это без зеленого ответа, пока Google не исправит эту ошибку.

person Tony Lâmpada    schedule 31.10.2014

Проверьте файл queue.yaml и убедитесь, что он правильно настроен.

queue:
- name: default
  retry_parameters:
    task_retry_limit: 0
person maciekrb    schedule 04.11.2014