Решения для очередей для ASP.NET MVC

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

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

Был ли у кого-нибудь (хороший или плохой) опыт?

Спасибо!

ОБНОВЛЕНИЕ:

Чтобы уточнить, я не говорю об очередях входящих запросов. Попробую проиллюстрировать, что я имею в виду ...

1) Стандартная ситуация:

  • Запрос из браузера
  • Серверная обработка начинается
  • Начало долгой работы
  • Долгая работа завершена
  • Обработка сервера завершена
  • Ответ возвращен в браузер

2) Что я ищу:

  • Запрос из браузера
  • Серверная обработка начинается
  • Длинное задание помещено в очередь
  • Обработка сервера завершена
  • Ответ возвращен в браузер

И в другом процессе (возможно, после отправки ответа):

  • Долгое задание взято из очереди
  • Долгая работа начинается
  • Долгая работа закончена

В первом случае пользователь долго ждал ответа сервера, во втором - быстро.

Конечно, есть определенные виды работ, которые подходят для этого, а некоторые нет.

ОБНОВЛЕНИЕ 2:

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

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


person UpTheCreek    schedule 31.08.2009    source источник
comment
Очередь выполняется IIS. Каждый запрос помещается в очередь, которая обрабатывается рабочими процессами. Обслуживание рабочих процессов и обработка запросов / ответов выполняется IIS. Зачем внедрять второй механизм очередей?   -  person Christian13467    schedule 31.08.2009
comment
@ Christian13467: Я говорю о другой концепции - см. Объяснение в обновлении.   -  person UpTheCreek    schedule 31.08.2009


Ответы (6)


Разместите данные задания в очереди MSMQ и используйте процесс службы Windows предметы в очереди. Или позвольте веб-запросу порождать процесс, обрабатывающий элементы в очереди.

person Magnus Johansson    schedule 31.08.2009
comment
Это немного ниже, чем я думал, но, возможно, я неправильно смотрю на него - у меня нет навыков MSMQ, но я изучу его - спасибо. - person UpTheCreek; 31.08.2009

Сервисная шина Rhino - еще одно решение, которое может вам подойти:
http://ayende.com/Blog/archive/2008/12/17/rhino-service-bus.aspx

person Joel Martinez    schedule 31.08.2009
comment
Спасибо - проверю. Раньше мне нравилось читать посты Айенде по другим темам :) Готово ли оно к производству? - person UpTheCreek; 31.08.2009
comment
Я лично никогда не использовал его в продакшене, однако я знаю людей, которые использовали его в продакшене. - person Joel Martinez; 31.08.2009

Вы можете проверить, используя ESB. Я играл с MassTransit: http://code.google.com/p/masstransit/ - документация (или, по крайней мере, была) немного скудна, но ее легко реализовать.

Кроме того, я разрабатываю приложения для работы на Amazon EC2, и мне очень нравится их сервис AmazonSQS.

Спасибо,

Хэл

person Hal    schedule 31.08.2009
comment
Я проверю Mass Transit - я заметил, что он построен на MSMQ. Я ищу, наверное, что-то вроде Amazon SQS - Спасибо. - person UpTheCreek; 31.08.2009

Поскольку в другом комментарии вы упомянули, что искали эквивалент службы sqs от Amazon ... возможно, вам стоит заглянуть в Windows Azure. У них есть эквивалентный API очереди:
http://msdn.microsoft.com/en-us/library/dd179363.aspx

person Joel Martinez    schedule 31.08.2009

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

person Colin Desmond    schedule 31.08.2009

Я думаю, что комментарий Криситана может быть вашим ответом, но, учитывая, что я мало знаю о IIS и очереди с ним, моим решением было бы:

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

ИЗМЕНИТЬ

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

person Martin    schedule 31.08.2009
comment
Нет, комментарий Кристиана не является моим ответом;) Я рассматривал вариант «катить самостоятельно, используя БД», но я ищу что-то более надежное и специально разработанное. Я не хочу изобретать колесо заново (мое, вероятно, не было бы идеально круглым;) - person UpTheCreek; 31.08.2009
comment
Просто чтобы прояснить повторное редактирование - клиенту не нужно будет обновлять результаты работы, поэтому опрос не потребуется. - person UpTheCreek; 31.08.2009