Стратегия управления долгосрочными процессами в веб-приложении? - PullRequest
5 голосов
/ 22 мая 2011

Я занимаюсь разработкой веб-приложения asp.net.Особенность приложения заключается в том, что пользователь может поставить в очередь ряд длительных операций, а затем нажать «Выполнить», очередь будет обработана.

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

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

Из моего исследования было высказано предположение, что asp.net может вызывать службу Windows?Возможно, это хостинг веб-службы WCF.

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

Ответы [ 4 ]

5 голосов
/ 22 мая 2011

Также проверьте MSMQ,

http://msdn.microsoft.com/en-us/library/ms711472(v=vs.85).aspx

По существу, веб-приложение помещает «задание» или «группу заданий» в очередь.

Служба работает постоянно, исключая очередную «работу» или «группу рабочих мест» и приступая к работе с ними.

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

Наслаждайтесь.

2 голосов
/ 22 мая 2011

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

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

1 голос
/ 22 мая 2011

Использование службы Windows - хорошая идея. Хотя у меня нет опыта его использования и я не знаю о неожиданных подводных камнях.
Кроме того, вы можете попробовать шаблон Fire And Forget . (Более подробную информацию и образцы можно найти здесь ) Использование многопоточности может быть другой вариант. Для получения дополнительной информации, проверьте:
http://msdn.microsoft.com/en-us/magazine/cc163587.aspx
http://msdn.microsoft.com/en-us/magazine/cc164128.aspx#S6
http://msdn.microsoft.com/en-us/library/ff647332.aspx

0 голосов
/ 13 марта 2012

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

1) добавить свойство в мой класс, идентификатор работы.2) когда веб-пользователь запускает задание, сгенерируйте новый идентификатор задания и присвойте его указанному выше свойству.3) когда мой класс работает, обновите таблицу журнала в БД.обновить его на основе идентификатора задания.4) на внешнем интерфейсе проведите простой процесс ajax, проверяющий состояние идентификатора задания каждые x секунд.

Вот и все.

...