Celery: Десятки тысяч задач backend_cleanup выполняются каждую ночь с 22:42. Все асинхронные функции перестают работать

Созданный на 21 окт. 2017  ·  3Комментарии  ·  Источник: celery/celery

Контрольный список

  • [x] Я включил в этот выпуск вывод celery -A proj report .
    (если у вас нет такой возможности, то хотя бы укажите Celery
    версия затронута).
  • [x] Я подтвердил, что проблема существует с ветвью master Celery.

Мое приложение разработано с использованием django1.11 и celery4.1 [sqs]. Он развертывается на Amazon AWS через Elastic Beanstalk. AWS SQS - брокер.

Действия по воспроизведению

Проблема появляется каждую ночь около 22:42 и длится около 1 часа. Начинают выполняться десятки тысяч задач backend_cleanup. Согласно списку результатов задачи в админке, каждая задача выполняется успешно. Использование ЦП иногда остается на уровне 100%. Каждая страница приложения открывается с трудом. Через 1 час после возникновения проблемы загрузка ЦП вернулась в норму. Однако очереди расклиниваются. Никакие задачи delay () не могут быть выполнены. Мне нужно очистить очередь в SQS, перезапустить приложение и повторно загрузить весь код в AWS Elastic Beanstalk. Тогда задачи delay () будут выполняться нормально. Если я не сделаю очистку, перезапуск или повторную загрузку, ни одна из асинхронных задач не будет выполнена. Даже встроенная задача backendcleaup не может запуститься. В моем приложении нет периодических задач или задач crontab, кроме встроенной задачи celery.backend_cleanup. Может ли кто-нибудь помочь мне с этой проблемой?

Ожидаемое поведение

Мне нужно, чтобы все приложение работало нормально после завершения задач backend_cleanup.

Фактическое поведение

Описано в ## Шагах по воспроизведению

сельдерей-sqs-worker-report.txt

Question

Самый полезный комментарий

Вы можете просто перезаписать расписание и не использовать crontab:
'celery.backend_cleanup': { 'task': 'celery.backend_cleanup', 'schedule': 86400, # every 24 hours instead of crontab('0', '4', '*') which is used in celery beat 'options': {'expires': 12 * 3600}} ,

Все 3 Комментарий

Я только что обнаружил, что проблема, вероятно, во встроенной задаче celery.backend_cleanup. Я только что запустил приложение в локальной среде разработки. Когда было 22:42, огромные задачи backend_cleanup были запущены и успешно выполнены. Однако через пару секунд произошла ошибка. Вот ошибка.

[2017-10-23 22:51:27,677: CRITICAL/MainProcess] Unrecoverable error: Exception('Request Empty body  HTTP 599  Server aborted the SSL handshake (None)',)
Traceback (most recent call last):
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/worker.py", line 203, in start
    self.blueprint.start(self)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/bootsteps.py", line 370, in start
    return self.obj.start()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/consumer/consumer.py", line 320, in start
    blueprint.start(self)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/consumer/consumer.py", line 596, in start
    c.loop(*c.loop_args())
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/loops.py", line 88, in asynloop
    next(loop)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/hub.py", line 354, in create_loop
    cb(*cbargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 111, in on_readable
    return self._on_event(fd, _pycurl.CSELECT_IN)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 124, in _on_event
    self._process_pending_requests()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 132, in _process_pending_requests
    self._process(curl, errno, reason)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 178, in _process
    buffer=buffer, effective_url=effective_url, error=error,
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 150, in __call__
    svpending(*ca, **ck)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 143, in __call__
    return self.throw()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 140, in __call__
    retval = fun(*final_args, **final_kwargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/funtools.py", line 100, in _transback
    return callback(ret)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 143, in __call__
    return self.throw()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 140, in __call__
    retval = fun(*final_args, **final_kwargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/funtools.py", line 98, in _transback
    callback.throw()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/funtools.py", line 96, in _transback
    ret = filter_(*args + (ret,), **kwargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/aws/connection.py", line 253, in _on_status_ready
    raise self._for_status(response, response.read())
Exception: Request Empty body  HTTP 599  Server aborted the SSL handshake (None)

Между тем из AWS SQS исчезла очередь. Затем несколько задач backend_cleanup продолжили выполнение. И наконец, появилось предупреждение.

[2017-10-23 22: 51: 28,967: WARNING / MainProcess] Восстановление 10 неподтвержденных сообщений

И, наконец, прекратилось HTTPS-соединение с очередью SQS. Приложение не могло повторно подключиться к SQS, если я повторно не развернул приложение в AWS Elastic Beanstalk.

Может ли кто-нибудь помочь мне с этой проблемой? Мы будем очень благодарны за любой ответ.

Думаю, я решил проблему. Проблема никогда не возникает после того, как я изменил CELERY_RESULT_BACKEND на «redis» с «django-db» и изменил CELERY_TIMEZONE на «UTC». Хотя результаты задач в Django Admin перестали добавлять результаты задач, моя проблема была в основном решена.

Вы можете просто перезаписать расписание и не использовать crontab:
'celery.backend_cleanup': { 'task': 'celery.backend_cleanup', 'schedule': 86400, # every 24 hours instead of crontab('0', '4', '*') which is used in celery beat 'options': {'expires': 12 * 3600}} ,

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

auvipy picture auvipy  ·  102Комментарии

Twista picture Twista  ·  55Комментарии

gugu picture gugu  ·  48Комментарии

girishbin picture girishbin  ·  45Комментарии

aromanovich picture aromanovich  ·  68Комментарии