Решения для очередей для ASP.NET MVC - PullRequest
7 голосов
/ 31 августа 2009

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

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

Кто-нибудь имел (хороший или плохой) опыт?

Спасибо!

UPDATE:

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

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

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

2) Что я изучаю:

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

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

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

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

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

UPDATE2:

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

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

Ответы [ 6 ]

5 голосов
/ 31 августа 2009

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

3 голосов
/ 31 августа 2009

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

2 голосов
/ 31 августа 2009

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

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

Спасибо

Hal

1 голос
/ 31 августа 2009

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

1 голос
/ 31 августа 2009

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

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

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

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

EDIT

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

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