предложения для демона, который принимает zip-файлы для обработки - PullRequest
2 голосов
/ 17 апреля 2009

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

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

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

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

как люди решали это в прошлом? Какие еще подходы я могу использовать?

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

Ответы [ 3 ]

1 голос
/ 17 апреля 2009

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

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

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

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

1 голос
/ 25 ноября 2009

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

  1. django view принимает, загружает магазины
  2. сельдерей Task отправляется для обработки загрузки. вся работа выполняется внутри Task.
1 голос
/ 17 апреля 2009

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

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

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

...