Google App Engine: task_retry_limit не работает?

У меня есть приложение Python GAE.

Я хочу, чтобы мои задачи перестали работать или просто повторили один раз, если они не сработают. Прямо сейчас, они бегут навсегда, несмотря на то, что сообщает мне файл yaml!

Вот запись queue.yaml:

 - name: globalPurchase
   rate: 10/s
   bucket_size: 100
   retry_parameters:
     task_retry_limit: 1

Если задача globalPurchase выходит из строя с кодом ошибки 500, она повторяется вечно до тех пор, пока оно не удастся с этим сообщением в журналах:

"Задача с именем" задача14 "в очереди" globalPurchase "не выполнена с кодом 500, повторит попытку через 30 секунд"

Почему task_retry_limit фактически не используется?

Ответ 1

У меня была та же проблема. Документации и инструментов в этой области не хватает, но вот что я нашел:

  • Параметры повтора не влияют на сервер разработки. Я пробовал много разных комбинаций, но он всегда был просто неопределенным шагом на 30 секунд. Параметры вступили в силу, когда я развернулся на рабочем сервере.
  • Я не нашел способ отключить все повторы (за исключением того, что мой обработчик не бросает исключения).
    • Если task_retry_limit=0, он все равно повторяет попытку.
    • Если установлены task_retry_limit=0 и task_age_limit, то queue.yaml отклоняется с сообщением, что task_retry_limit должно быть положительным.
    • Аналогично, он жалуется, что task_age_limit=0.
    • Если вы установите task_retry_limit=1 и task_age_limit=1s (по-видимому, минимальные значения), вы все равно получите один повтор.
  • Минимальное время повторения составляет 20 секунд. Если задержка, указанная вашей конфигурацией, меньше 20, она будет просто ждать 20 секунд.
  • Время до повторной попытки непредсказуемо; он кажется случайным образом отложен на минуту. После этого повторы следуют настроенному расписанию.

Ответ 2

У меня была такая же проблема, как ни странно, я начинаю нормально работать после того, как оставил ее, как есть в течение нескольких часов... Возможно, есть время, необходимое для обновления GAE??

Во всяком случае, для меня были настроены следующие параметры:

# configure the default queue
- name: default
  rate: 1/s
  retry_parameters:
    # task will stop retrying ONLY when BOTH LIMITS ARE REACHED
    task_retry_limit: 1
    task_age_limit: 1s

Ответ 3

Вы должны установить task_retry_limit равным нулю, если вы не хотите, чтобы он вообще повторился, и вам нужно использовать его в комбинации с task_age_limit. Логика повторной очереди очереди приложений использует комбинацию task_try_limit и task_age_limit, чтобы определить, когда остановить повторную попытку.