Фоновые процессы веб-приложений, вопрос дизайна новичка - PullRequest
9 голосов
/ 10 мая 2009

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

Один из моих пользовательских процессов связан с интенсивной обработкой на сервере (то есть пользователь вводит что-то, серверу требуется ~ 10 минут для его обработки). В настольном приложении я бы выбрасывал пользовательский ввод в очередь, защищенную мьютексом, и имел выделенный фоновый поток, выполняющий блокировку с низким приоритетом в очереди с использованием этого мьютекса.

Однако в веб-приложении все, кажется, ориентировано на синхронизацию с HTTP-запросами.

Предполагая, что я буду использовать базу данных в качестве своей очереди, какова наилучшая архитектура для выполнения фонового процесса?

Ответы [ 4 ]

7 голосов
/ 10 мая 2009

Есть две школы мысли об этом (по крайней мере).

  1. Бросить работу в очередь и обработать что-то еще за пределами вашего веб-стека.

  2. Бросить работу в очередь и обработать что-то еще в вашем веб-стеке.

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

Обычно я работаю с номером 1, где у меня есть специальная служба Windows, которая заботится об этих вещах. Вы также можете сделать это с заданиями SQL или чем-то подобным.

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

2 голосов
/ 10 мая 2009

С:

1) Это общая проблема,

2) Вы новичок в своей платформе

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

1) статус связи между работником и веб-стеком. Это активирует веб-страницы, которые показывают процентное значение полного числа для задания, уверяют человека, что задание выполняется, и т. Д.

2) Как обеспечить, чтобы рабочий процесс не умер.

3) Если в задании возникла ошибка, будет ли рабочий процесс автоматически повторять ее периодически? Будете ли вы или оперативный сотрудник получать уведомления о сбое в работе?

4) Можно ли добавить дополнительных работников для увеличения параллелизма по мере увеличения числа рабочих мест? Или, что еще лучше, можно ли добавлять рабочих на другие серверы?

Если вы не можете найти хорошее решение в Django / Python, вы также можете подумать о переносе решения с другой платформы на свою. Я использую delayed_job для Ruby on Rails. Рабочий процесс управляется runit.

С уважением,

Larry

1 голос
/ 10 мая 2009

В целом, я бы посмотрел на фоновые процессы на другом сервере, особенно если ваш веб-сервер имеет какую-либо нагрузку.

0 голосов
/ 14 августа 2009

Запуск длинных процессов в Django: http://iraniweb.com/blog/?p=56

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...