В настоящее время я работаю над переносом существующего веб-проекта на основе Django на один сервер в Amazon Elastic Beanstalk. До сих пор я успешно настроил проект для использования RDS, Elastic Search, Simple Email Service и S3 без особых проблем. Я использую Code Deploy для создания контейнера Docker для проекта Django и развертывания в среде Elastic Beanstalk. Все это прекрасно работает, но я сталкиваюсь с проблемой, пытаясь заставить рабочую среду Elastic Beanstalk хорошо работать с этой настройкой.
Я развертываю тот же контейнер Docker в моей рабочей среде, но с другой точкой запуска для запуска celery -A project worker -l INFO
вместо gunicorn config.wsgi --bind 0.0.0.0:5000 --chdir=/app --workers 3
. Это похоже на работу; работник принимает сообщения и обрабатывает их очень хорошо, но часто кажется, что работа прекращается на несколько минут, даже если в очереди ожидают сообщения, ожидающие в очереди.
Во время моего тестирования я пытаюсь запустить процедуру генерации счетов, которая ставит в очередь сообщение для счета каждой учетной записи, используя Celery group
в chain
, чтобы он обрабатывал счета, а затем отправлял мне электронное сообщение " завершено "уведомление. Всего у меня в очереди около 250 сообщений. За журналами сельдерея для контейнера Docker я вижу группы из 8-12 сообщений, которые собираются, затем обрабатываются в течение одной или двух секунд, но затем рабочий бездействует несколько минут за раз. Обычно около 4 минут.
Я не вижу нигде ошибок, которые я мог бы посмотреть.
Я также экспериментировал с масштабированием рабочей среды, чтобы она работала с несколькими рабочими узлами, но это просто распространило проблему на несколько узлов. т. е. вместо того, чтобы один работник собирал 8–12 сообщений, два работника собирали между 4–6 сообщениями, обрабатывали их, а затем бездействовали.
На данный момент я понятия не имею, на что мне следует больше смотреть, и я обдумываю полностью отказаться от рабочей среды. Может быть, имеет смысл просто запустить рабочий процесс Celery в той же среде, что и веб-сервер? Я бы предпочел не делать этого, поскольку я думал, что было бы намного проще настроить правила масштабирования для веб-сервера и рабочих независимо, но похоже, у меня не будет другого выбора.
Есть ли что-то, чего мне не хватает в этой настройке, или по какой-то причине, что рабочая среда Celery ведет себя таким образом?