предложения для демона, который принимает zip-файлы для обработки

Я хочу написать демона, который:

  • читает сообщение из очереди (sqs, rabbit-mq, ​​что угодно...), содержащее путь к zip-файлу
  • обновляет запись в базе данных, говоря что-то вроде «это задание обрабатывается»
  • читает содержимое вышеупомянутого архива и вставляет строку в базу данных с информацией, полученной из метаданных файла, для каждого найденного файла
  • дублирует каждый файл на s3
  • удаляет zip-файл
  • помечает работу как "завершенную"
  • прочитать следующее сообщение в очереди, повторить

это должно работать как служба и инициироваться сообщением в очереди, когда кто-то загружает файл через веб-интерфейс. загрузчику не нужно сразу видеть результаты, но загрузка будет обрабатываться в фоновом режиме довольно целесообразно.

Я свободно владею python, поэтому первое, что приходит на ум, — это написать простой сервер с крутилкой для обработки каждого запроса и выполнения упомянутого выше процесса. но я никогда не писал ничего подобного, что могло бы работать в многопользовательском контексте. он не будет обслуживать сотни загрузок в минуту или час, но было бы неплохо, если бы он мог обрабатывать несколько за раз, разумно. я также не очень хорошо разбираюсь в написании многопоточных приложений и решении таких проблем, как блокировка.

как люди решали это в прошлом? какие другие подходы я мог бы предпринять?

заранее спасибо за любую помощь и обсуждение!


person Carson    schedule 16.04.2009    source источник
comment
В итоге я остановился на celery, системе очередей с подключаемыми бэкэндами для python. он очень хорошо интегрируется с django.   -  person Carson    schedule 25.11.2009


Ответы (3)


Я использовал Beanstalkd в качестве демона очередей с очень хорошим эффектом (некоторая оперативная обработка и обработка изображений). изменение размера - более 2 миллионов за последние несколько недель). Бросьте сообщение в очередь с именем файла zip (возможно, из определенного каталога) [я сериализую команду и параметры в JSON], и когда вы резервируете сообщение в своем рабочем клиенте, никто другой не может его получить, если вы не разрешите истечет время ожидания (когда он вернется в очередь, чтобы его забрали).

Остальное — распаковка и загрузка на S3, для чего есть другие библиотеки.

Если вы хотите обрабатывать несколько zip-файлов одновременно, запускайте столько рабочих процессов, сколько хотите.

person Alister Bulman    schedule 16.04.2009

Я бы не стал делать что-либо многопоточное и вместо этого использовал очередь и базу данных для синхронизации столько рабочих процессов, сколько вам нужно для запуска.

Для этого приложения я думаю, что скрученный или любой другой фреймворк для создания серверных приложений будет излишним.

Будь проще. Сценарий Python запускается, проверяет очередь, делает какую-то работу, снова проверяет очередь. Если вам нужен правильный фоновый демон, вы можете просто убедиться, что вы отсоединились от терминала, как описано здесь: Как создать демон в Python?

Добавьте ведение журнала, возможно, блокировку try/except, чтобы отправлять вам сообщения об ошибках по электронной почте.

person rhettg    schedule 17.04.2009
comment
это будет работать как служба, которая будет запускаться, когда кто-то загружает файл. им не нужно сразу видеть результаты, но загрузка должна запускать этот процесс в фоновом режиме. я изменяю вопрос, чтобы отразить это. - person Carson; 17.04.2009

я решил использовать комбинацию сельдерея (http://ask.github.com/celery/introduction.html), rabbitmq и простое представление django для обработки загрузок. рабочий процесс выглядит так:

  1. django view принимает, сохраняет загрузку
  2. сельдерей Task отправляется для обработки загрузки. вся работа выполняется внутри Task.
person Carson    schedule 25.11.2009