предложения для демона, который принимает для обработки zip-файлы
Вопрос
я хочу написать демон, который:
- читает сообщение из очереди (sqs, Rabbit-MQ, что угодно...), содержащее путь к zip-файлу
- обновляет запись в базе данных, говоря что-то вроде «это задание обрабатывается»
- считывает содержимое вышеупомянутого архива и вставляет строку в базу данных с информацией, полученной из метаданных файла для каждого найденного файла.
- дублирует каждый файл на s3
- удаляет zip-файл
- помечает задание как «завершенное»
- прочитать следующее сообщение в очереди, повторить
это должно работать как служба и инициироваться сообщением, поставленным в очередь, когда кто-то загружает файл через веб-интерфейс.пользователю, загружающему файл, не обязательно сразу видеть результаты, однако загрузка может быть обработана в фоновом режиме, что весьма целесообразно.
Я свободно владею Python, поэтому самое первое, что приходит на ум, — это написать простой сервер с Twisted для обработки каждого запроса и выполнения упомянутого выше процесса.но я никогда не писал ничего подобного, что могло бы работать в многопользовательском контексте.он не будет обслуживать сотни загрузок в минуту или час, но было бы неплохо, если бы он мог обрабатывать несколько одновременно, это разумно.Я также не очень хорошо знаком с написанием многопоточных приложений и решением таких проблем, как блокировка.
как люди решали эту проблему в прошлом?какие еще подходы я мог бы предпринять?
заранее спасибо за любую помощь и обсуждение!
Решение 3
я решила использовать комбинацию сельдерея (http://ask.github.com/celery/introduction.html), RabbitMQ и простое представление Django для обработки загрузок.рабочий процесс выглядит так:
- Представление django принимает, загружает магазины
- сельдерей
Task
отправляется для обработки загрузки.вся работа выполняется внутриTask
.
Другие советы
я использовал Бобовый стебель в качестве демона очередей с очень хорошим эффектом (некоторая оперативная обработка и изменение размера изображения - за последние несколько недель их было уже более 2 миллионов).Бросьте сообщение в очередь с именем zip-файла (возможно, из определенного каталога) [я сериализую команду и параметры в JSON], и когда вы зарезервируете сообщение в своем рабочем клиенте, никто другой не сможет его получить, если вы не разрешите. истечет время ожидания (когда оно вернется в очередь для получения).
Остальное — разархивация и заливка на S3, для чего есть другие библиотеки.
Если вы хотите обрабатывать несколько zip-файлов одновременно, запустите столько рабочих процессов, сколько захотите.
Я бы не делал ничего многопоточного и вместо этого использовал очередь и базу данных для синхронизации столько рабочих процессов, сколько вам нужно запустить.
Я думаю, что для этого приложения скрученный или любой другой фреймворк для создания серверных приложений будет излишним.
Будь проще.Скрипт Python запускается, проверяет очередь, выполняет какую-то работу, снова проверяет очередь.Если вам нужен подходящий фоновый демон, возможно, вам стоит просто отключиться от терминала, как описано здесь: Как создать демон в Python?
Добавьте некоторую регистрацию, возможно, блокировку try/Exception для отправки вам по электронной почте ошибок.