Решения для очередей для ASP.NET MVC
Я изучал концепцию организации очередей для веб-приложений (то есть, помещая некоторые типы заданий в очередь для завершения отдельным работником, а не для завершения в цикле веб-запросов).
Я хотел бы знать, существуют ли какие-либо хорошие решения для этого, которые могут быть использованы в ASP.NET MVC environemnt.
У кого-нибудь был (хороший или плохой) опыт?
Спасибо!
ОБНОВИТЬ:
Просто чтобы уточнить, я не говорю об очередности входящих запросов. Я попытаюсь проиллюстрировать, что я имею в виду...
1) Стандартная ситуация:
- Запрос из браузера
- Начинается обработка сервера
- Долгая работа начинается
- Долгая работа закончена
- Серверная обработка завершена
- Ответ возвращен в браузер
2) Что я смотрю в:
- Реквест от браузера
- Начинается обработка сервера
- Долгая работа помещена в очередь
- Серверная обработка завершена
- Ответ возвращен в браузер
И в другом процессе (возможно, после отправки ответа):
- Долгая работа взята из очереди
- Долгая работа начинается
- Долгая работа закончена
В первом случае пользователь долго ждал ответа сервера, во втором - быстро.
Конечно, есть определенные виды работ, которые подходят для этого, а некоторые - нет.
UPDATE2:
Клиент не должен быть немедленно обновлен с результатами долгой работы. Изменения будут отображаться в приложении всякий раз, когда пользователь обновляет страницу (конечно, после того, как работа завершена).
Подумайте о некоторых вещах, которые происходят при переполнении стека - они не сразу обновляются в каждой части приложения, но это происходит довольно быстро - я подозреваю, что некоторые из этих заданий ставятся в очередь.
6 ответов
Разместите данные задания в очереди MSMQ, и служба Windows обработает элементы в очереди. Или пусть веб-запрос порождает процесс, который обрабатывает элементы в очереди.
Rhino Service Bus - это еще одно решение, которое может работать на вас:
http://ayende.com/Blog/archive/2008/12/17/rhino-service-bus.aspx
Вы можете проверить использование ESB. Я поиграл с MassTransit: http://code.google.com/p/masstransit/ - документация (или, по крайней мере, была) немного скудна, но ее легко реализовать.
Кроме того, я разрабатываю приложения для работы на Amazon EC2 и очень люблю их сервис AmazonSQS.
Спасибо,
Хэл
Поскольку вы упомянули в другом комментарии, что вы ищете эквивалент службы Amazon на sqs... вы можете заглянуть в Windows Azure. У них есть эквивалентные очереди API:
http://msdn.microsoft.com/en-us/library/dd179363.aspx
Я реализовал этот шаблон, когда веб-сервер асинхронно вызывает службу WCF. Мастера VS генерируют асинхронные прокси для вас, когда вы используете сервис WCF. Если у вас должна быть гарантированная доставка по запросу в службу, вы можете использовать MSMQ в качестве транспортного уровня для службы WCF.
Я думаю, что комментарий Кристиана может быть вашим ответом, но, учитывая, что я не знаю много о IIS и очереди с ним, мое решение будет:
Сделайте асинхронный запрос и загрузите детали задания в базу данных. Затем выполните задание, чтобы просмотреть базу данных и обработать детали задания. Я делаю это для одного из моих сайтов. Возможно, это не лучшее решение, но оно выполнит свою работу.
РЕДАКТИРОВАТЬ
Мой ответ может все еще работать, но вам понадобится какой-то механизм опроса на клиенте, чтобы постоянно проверять базу данных, чтобы увидеть, выполнена ли работа этого пользователя, а затем получить необходимые данные.