У меня есть веб-приложение Django, и у меня есть несколько задач, которые должны работать (или фактически запускаться) в фоновом режиме.
Приложение развертывается следующим образом:
- apache2-mpm-рабочий;
- mod_wsgi в режиме демона (1 процесс, 15 потоков).
Фоновые задачи имеют следующие характеристики:
- они должны работать с регулярным интервалом (каждые 5 минут или около того);
- им требуется контекст приложения (т. е. пакеты приложений должны быть доступны в памяти);
- им не требуется никакого ввода, кроме доступа к базе данных, для выполнения некоторых не очень тяжелых задач, таких как отправка электронной почты и обновление состояния базы данных.
Теперь я подумал, что самый простой подход к этой проблеме будет заключаться в том, чтобы просто использовать существующий процесс приложения (порожденный mod_wsgi). Реализуя задачу как часть приложения и предоставляя для нее HTTP-интерфейс, я предотвратил бы накладные расходы другого процесса, который удерживает все приложение в памяти. Можно настроить простой cronjob, который отправляет запрос на этот HTTP-интерфейс каждые 5 минут, и на этом все. Поскольку процесс приложения обеспечивает 15 потоков, а задачи довольно легкие и выполняются только каждые 5 минут, я полагаю, что они не будут мешать производительности операций веб-приложения, обращенных к пользователю.
Тем не менее... Я провел некоторое онлайн-исследование и не видел, чтобы кто-то поддерживал этот подход. Во многих статьях предлагается значительно более сложный подход, основанный на полноценном компоненте обмена сообщениями (например, Celery, который использует RabbitMQ). Хотя это и сексуально, для меня это звучит как излишество. В некоторых статьях предлагается настроить cronjob, который запускает скрипт, выполняющий задачи. Но это тоже не кажется очень привлекательным, поскольку приводит к созданию нового процесса, который загружает все приложение в память, выполняет какую-то крошечную задачу и снова уничтожает процесс. И так повторяется каждые 5 минут. Не похоже на элегантное решение.
Итак, я ищу отзывы о предложенном мной подходе, описанном в абзаце перед предыдущим абзацем. Верны ли мои рассуждения? Не упускаю ли я из виду (потенциальные) проблемы? А как насчет моего предположения, что производительность приложения не пострадает?