Надлежащий мониторинг Celery и управление файлами с помощью веб-сервисов
Мы работаем над платформой для Интернета и Интранета, которая обслуживает запросы клиентов через приложения веб-сайта. Имеются тяжелые вычисления над записями баз данных и файлами. Мы хотим обновлять состояние этих вычислений с помощью push-уведомлений клиенту и вносить изменения в файлы без риска возникновения условий гонки. Архитектура должна работать как в низкомасштабных односерверных средах, так и в высокомасштабных кластерных средах. Пока мы используем веб-сервер Django с Postgresql, Python-библиотеку Channels и RabbitMQ в качестве Messagebroker.
Когда HTTP-запрос от клиента поступает в Django, мы запускаем задачу через task.delay() и сразу же возвращаем клиенту идентификатор задачи task_id. Затем клиент открывает веб-сокет к другому Django-маршруту и передает интересующие его task_id. Затем Django опрашивает состояние задачи через AsyncResult(task_id).state. Как только состояние изменяется, мы считываем результаты через AsyncResult(task_id).get и передаем task_results клиенту.
Вот похожая диаграмма последовательности, из другого проекта, который я нашел в Интернете. Источник (18.09.21)
На диаграмме не видно, что channels_worker должен fetch из Django получить файл, над которым он работает. Часть результата предназначена не для клиента, а для обновления файла. Django блокирует и обновляет файл локально, как только клиент запросит, а Django получит task_results от celery (изменения только добавляют атрибуты и не будут конфликтовать друг с другом).
Мои мысли по поводу этой архитектуры таковы:
- мониторинг сельсинов-событий пока плохой.
- Он запускается только клиентом, который для начала должен знать о задачах.
- Django не подходит для мониторинга
- и опрос не эффективен в целом.
- Управление файлами кажется подозрительным.
Я бы предпочел правильный мониторинг, при котором события передаются в Django и клиенту. Клиент должен иметь возможность потреблять события в любое время позже.
У меня есть некоторые мысли по поводу решений, но сначала я хотел бы услышать ваше мнение. Позже я смогу вынести их на обсуждение.
Приветствия Python
Мы все любим Python, но нам не нужно изобретать колесо всякий раз, когда мы хотим лучшего мониторинга или большего контроля над поведением наших систем.
С учетом вышесказанного, я бы рекомендовал изменить архитектуру решения, чтобы уменьшить сложность вашего django-приложения, изучив, что предлагают отечественные облачные решения в плане архитектуры микросервисов (API-Gateway), AWS SQS и SNS, вычислений и вариантов хранения ваших файлов.
Такой подход возьмет на себя большую часть работы по мониторингу, конфигурированию, управлению файлами, и, что самое главное, ваше монолитное приложение сможет масштабироваться без изменений кода или дополнительных конфигураций.