Как реализовать систему рабочих процессов на основе очередей? - PullRequest
4 голосов
/ 30 июня 2010

Я работаю над системой управления документами. Пример рабочего процесса будет выглядеть примерно так:

  1. Документ отправлен в систему по электронной почте
  2. Система выполняет ряд подготовительных действий к документу
  3. Документ передан пользователю для дальнейшей обработки
  4. После этого документ отправляется в отдел обеспечения качества
  5. После этого система выполняет ряд или постобработку документа
  6. Документ считается полностью обработанным и распространенным (например, отправлено по электронной почте тому, кто отправил документ в систему и т. Д.)

Поскольку громкость моего ввода будет варьироваться (но обычно будет большой громкостью), я очень сомневаюсь в масштабируемости.

Например, скажем, система уже загрузила вложения электронной почты. Если вложения являются документами PDF, система должна разбить PDF на отдельные страницы, затем преобразовать каждую страницу в миниатюры нескольких размеров и т. Д. Я планирую проверить работу cron (скажем, каждую минуту), чтобы проверить, есть ли PDF документы, которые необходимо обработать. Используя систему маркировки (например, «Документ PDF готов к обработке»), я могу проверить базу данных на наличие всех документов PDF, которые помечены для обработки. После того, как обработка PDF завершена, флаг может быть обновлен до «Обработка PDF завершена».

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

Возможным решением является немедленная пометка документов PDF с помощью «Документ PDF обрабатывается в настоящее время». Таким образом, при выполнении следующего задания cron будут исключены уже обрабатываемые.

Таким образом, каждый шаг в рабочем процессе, вероятно, будет иметь 3 флага:

  1. PDF документ готов к обработке
  2. Документ PDF, который в настоящее время обрабатывается
  3. Обработка PDF завершена

То же самое для QA:

  1. Документ готов к QA
  2. Документ, являющийся в настоящее время QAd
  3. Документ QA Готово

Это хороший подход? Есть ли лучший подход? Буду ли я иметь эти флаги как один столбец таблицы «Документ PDF» в базе данных? Или флаги должны быть его собственной таблицей (например, особенно если документ может иметь несколько установленных флагов).

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

Ответы [ 2 ]

2 голосов
/ 30 июня 2010

Чтобы решить проблему одновременной обработки одного и того же документа, вы можете использовать множество пакетов планировщика, которые помогут вам управлять этим аспектом.http://www.quartz -scheduler.org / - это тот, который я использовал с большим успехом.

Чтобы решить вашу проблему, я бы получил 3 состояния: получено, поставлено в очередь, обработано (аналогичнок тому, что вы предлагаете).

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

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

Чтобы сделать шаг назад, в мире Java есть несколько отличных пакетов рабочих процессов, которые могут справиться с большинством ваших задач.хочу сделать, включая отложенную обработку PDF.Взгляните на поток jbpm или drools, это два замечательных, хотя и сложных, пакета.

ОБНОВЛЕНИЕ: Поток Drools объединен с JBPM.Для этой конкретной проблемы может быть что-то вроде «убийства комара с помощью базуки», но это отличный пакет для рабочего процесса.

0 голосов
/ 30 июня 2010

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

Если у вас есть распределенные компоненты, вы можете сделать гораздо хуже, чем исследовать решение AMQP, такое как RabbitMQ , так как оно заботится о помещении каждого задания в очередь,и убедиться, что только один из ваших потребителей берет на себя каждую работу.(мы будем моделировать каждую миниатюру как отдельную задачу).

Если, однако, вся система реализована на одном языке, а внутри одного процесса есть несколько более простых систем, которые вы можете использовать:

  • Resque - хорошее решение для Ruby
  • Java будет работать хорошо как LinkedBlockingQueue
  • Уверен, в c # будут некоторыеспособ создания очереди заданий (отказ от ответственности: я ничего не знаю о c #)
...