Очередь архитектуры asp.NET - MSMQ - PullRequest
6 голосов
/ 16 февраля 2010

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

Вопрос:

  • Как вы обрабатываете очередь?
  • Запускаете ли вы отдельный поток в Application_Start файла global.asax, который прослушивает очередь? Если есть сообщения, они раздаются по одному за раз.
  • Нужно ли это делать в отдельной теме? Что если в global.asax вы просто вызываете синглтон, например, который начинает прослушивать очередь? В каком потоке будет работать этот синглтон? (что за нить вызывает global.asax)
  • Каковы наилучшие практики для реализации этого? Ссылки? Ресурсы? Учебники? Примеры?
  • Мне не нравится эта идея, но не могли бы вы поместить exe-файл в корень вашего сайта, exe-файл, который запускает процесс прослушивания очереди ...
  • Если вы получаете сообщение из очереди, удаляете ли вы его, когда извлекаете, или удаляете, если денормализация для этого сеанса прошла успешно? Если вы удалите его, когда вытащите, и что-то пойдет не так ...
  • Я мог бы также создать свою собственную очередь в памяти, но перезапуск веб-сервера опустошил бы очередь, и многие сеансы в итоге не нормализовались бы, поэтому я думаю, что это действительно плохая идея.
    • Является ли MSMQ хорошим выбором или есть лучшие альтернативы?

Ответы [ 3 ]

4 голосов
/ 18 февраля 2010

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

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

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

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

2 голосов
/ 18 февраля 2010

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

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

1 голос
/ 18 февраля 2010
  • Как вы обрабатываете очередь?
  • Вы запускаете отдельный поток в Application_Start файла global.asax что слушает очередь? Если есть сообщения, они раздаются по одному время.
  • Нужно ли это делать в отдельной теме? Что делать, если в global.asax вы просто вызываете синглтон, например, который начинает слушать очередь? В каком потоке будет работать этот синглтон? (что это за нить вызывает global.asax)

[пропустить]

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

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

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

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

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

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

...