Архитектура, ставящая в очередь asp.NET - MSMQ

Проблема: приблизительно 300 кандидатов делают тест с помощью Flex. Тест состоит приблизительно из 100 упражнений. После каждого осуществления сервис.NET называют для хранения результата. Если кандидат заканчивает тест, все данные его теста денормализовываются Asp.NET. Эта денормализация может взять некоторый CPU и может занять 5 - 10 секунд. Теперь, большинство времен, некоторые кандидаты закончили их тест ранее, чем остальные, но все еще приблизительно 200 из них ожидают, пока их время не закончилось. В тот момент 200 кандидатов заканчивают свой тест, и 200 сессий денормализовываются одновременно. На данном этапе загрузка сервера (CPU) слишком высока, и причина звонит на веб-сервер, чтобы пойти не так, как надо. Теперь, вместо всех этих сессий, нормализуемых одновременно, я хотел бы добавить их к очереди, использующей MSMQ.

Вопрос:

  • Как Вы обрабатываете Очередь?
  • Вы запускаете отдельный поток в Application_Start global.asax, который слушает очередь? Если существуют сообщения, с ними имеют дело тот в то время.
  • Действительно ли необходимо сделать это в отдельном потоке? Что, если в global.asax Вы просто называете одиночный элемент, например, который начинает слушать очередь? В каком потоке будет работать этот одиночный элемент? (что является потоком, который называет global.asax),
  • Что лучшие практики должны реализовать это?Ссылки? Ресурсы? Учебные руководства? Примеры?
  • Мне не нравится идея, но могли Вы помещать exe на корень Вашего веб-сайта, exe, который запускает процесс, слушая очередь...
  • Если Вы вытаскиваете сообщение из очереди, Вы удаляете ее, когда Вы вытаскиваете ее, или Вы удаляете ее, если денормализация для этой сессии была успешна? При удалении его, когда Вы вытаскиваете его, и что-то идет не так, как надо...
  • Я мог также создать свою собственную очередь в памяти, но перезапуск веб-сервера освободит очередь, и много сессий закончило бы тем, что не было нормализовано, таким образом, я предполагаю, что это - действительно плохая идея.
    • Действительно ли MSMQ является хорошим выбором или является там лучшими альтернативами?
6
задан Lieven Cardoen 16 February 2010 в 15:06
поделиться

3 ответа

Вы можете рассмотреть возможность использования службы WCF с транспортом MSMQ. Я использовал этот подход в приложении, которое вычисляет комиссии:

Пользователь завершает работу мастера asp.net, настраивая параметры расчета Задание вычисления отправляется в WCF-Service с использованием транспорта MSMQ Сервисная транзакция завершается, как только при вводе задания в MSMQ Создана новая область транзакции для обработки экземпляров задания

Один недостаток состоит в том, что для транзакции потребуется MSDTC, что добавит некоторые накладные расходы при настройке на MS SQL Server и даже больше при работе с Oracle.

IDesign предоставляет множество полезных примеров и передовых методов по организации очередей WCF.

4
ответ дан 17 December 2019 в 00:08
поделиться

Лично я использую служебную шину для подобных сценариев. Я знаю, что это звучит как излишество, но я думаю, что служебные шины .net настолько хороши, что они требуют наименьшего количества написанного вами кода, потому что нелегко создать хороший планировщик для фоновых процессов, не нарушая потоки пула приложений. веб-приложение запущено. NServicebus и MassTransit - хорошие и достаточно хорошо документированные сервисные шины для вашего сценария. С сервисной шиной у вас есть инфраструктура, которая записывает в msmq и слушает msmq в нескольких приложениях, подключенных через очередь сообщений. Шина упрощает создание отдельного приложения, которое работает как фоновая служба и связано с вашим веб-приложением через очередь сообщений. Когда вы используете topself (включенный в nservicebus и masstransit), служебная шина автоматически создает установщик / деинсталлятор для отдельных приложений.

Вопрос: Почему вам не нравится идея иметь отдельный исполняемый файл?

2
ответ дан 17 December 2019 в 00:08
поделиться

Из документации MSDN :

Инструкция using обеспечивает вызов Dispose, даже если происходит исключение при вызове методов объекта. Такой же результат можно получить, поместив объект в блок try, а затем вызвав Dispose в блоке finally; фактически, именно так оператор using переводится компилятором.

Таким образом, объект всегда расположен. Если только вы не подключите кабель питания.

-121--2258366-

Можно присоединить к работающему процессу с помощью команды Debug - > Attach to Process. Если в Visual Studio имеется копия исходного кода с расширением .pdb, можно выполнить отладку в обычном режиме.

-121--4460138-
  • Как обработать очередь?
  • Запустить отдельный поток в Application_Start global.asax прослушивает очередь? Если есть сообщения, они выдаются один на время.
  • Необходимо ли это делать отдельной нитью? Что если в global.asax вы просто вызываете singleton, например, который начинает слушать очередь? В каком потоке пробежит этот одиночный? (что это за нить, которая вызывает global.asax)

[skip]

  • Мне не нравится идея, но не могли бы вы поместить exe в корень вашего веб-сайта, exe, который > запускает процесс прослушивания очереди...

Обычно очередь обрабатывается другой программой - не ASP.NET. Служба Windows или исполняемый файл, запущенный под планировщиком (и нет причин помещать его в корень вашего веб-сайта).

  • Если вы получаете сообщение из очереди, удалите его при извлечении он вышел или вы удалили его, если денормализация для этого сеанса была успешно? Если вы удалите его, когда вы вытащите его и что-то пойдет неправильно...

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

  • Какие наилучшие методы для реализации этого? Ссылки? Ресурсы? Учебные пособия? Примеры?

Это учебное пособие является хорошим введением и блог Джона Брейквелла превосходен и предлагает много хороших ссылок (в том числе на его простой в поиске боковой панели «Документация MSMQ»).

1
ответ дан 17 December 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: