Мы делаем это, имея в базе данных таблицу «Запрос».
Когда прибывает загрузка, мы создаем загруженный объект File и создаем Запрос.
Запускаем фоновый пакетный процессор.
Мы возвращаем страницу 200 "мы работаем над этим" - она показывает запросы и их статус.
Наш пакетный процессор использует Django ORM. Когда он заканчивается, он обновляет объект запроса. Мы можем (но не) отправлять уведомления по электронной почте. В основном, мы просто обновляем статус, чтобы пользователь мог снова войти в систему и увидеть, что обработка завершена.
Замечания по архитектуре пакетного сервера.
Это сервер WSGI, который ожидает на порту запроса на пакетную обработку. Запрос представляет собой REST POST с идентификационным номером; пакетный процессор ищет это в базе данных и обрабатывает его.
Сервер автоматически запускается нашим интерфейсом REST. Если это не работает, мы порождаем это. Это делает пользовательскую транзакцию медленной, ну да ладно. Это не должно разбиться.
Кроме того, у нас есть простой crontab, чтобы проверить, что он работает. Самое большее, это будет в течение 30 минут между "ты жив?" чеки. У нас нет формального сценария запуска (мы запускаем под Apache с mod_wsgi), но мы можем создать сценарий «перезапуска», который касается файла WSGI, а затем выполняет POST для URL, который выполняет проверку работоспособности (и запускает пакетный процессор).
Когда запускается пакетный сервер, могут быть необработанные запросы, для которых он никогда не получал POST. Таким образом, запуск по умолчанию - вывести ВСЕ работы из очереди запросов - при условии, что она что-то пропустила.