Очередь с использованием базы данных или MSMQ? - PullRequest
5 голосов
/ 23 марта 2010

Часть приложения, над которым я работаю, - это SWF, который показывает тест с 80 вопросами. Каждый вопрос сохраняется в SQL Server через WebORB и ASP.NET.

Если кандидат заканчивает тестирование, сессия должна быть подтверждена. Проблема в том, что иногда 350 кандидатов заканчивают тестирование в одно и то же время, и процессор на веб-сервере и SQL Server взрываются (350 проверок одновременно).

Теперь, как мне организовать очередь здесь? В базе данных есть таблица, в которой есть запись для каждого сеанса. Один столбец содержит статус. 1 закончен, 2 подтвержден.

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

  • Процесс, который проверяет таблицу на наличие записей со статусом 1. Если он находит ее, он проверяет сеанс. Итак, сеансы проверяются один за другим.
  • Если кандидат заканчивает свою сессию, сообщение отправляется в очередь MSMQ. Другой процесс прослушивает очередь и проверяет сеансы один за другим.

Сейчас:

  • Какой будет лучший подход?
  • С чего начать процесс проверки сеансов? В вашем global.asax (application_start)? Как служба Windows? Как exe в корне сайта, который запускается в application_start?

Мне кажется, проще всего использовать таблицу и искать записи со статусом 1.

Ответы [ 4 ]

4 голосов
/ 23 марта 2010

Подход MSMQ отделяет ваше веб-приложение от службы логики проверки и базы данных.

Это дает много преимуществ, некоторые из которых:

  • Было бы проще обрабатывать ситуации, когда логика проверки может обрабатывать 5 сеансов в секунду, и она получает 300 одновременно.В противном случае вам пришлось бы обрабатывать совокупные таймауты, повторные попытки и т. Д.

  • Было бы проще выполнить обслуживание службы проверки, не прерывая работу остальной части приложения.Когда служба проверки отключается, сообщения помещаются в очередь в MSMQ и обрабатываются снова, как только она запускается.

  • То же, что и выше, применяется для обслуживания базы данных.

3 голосов
/ 23 марта 2010

Если у вас нет опыта использования MSMQ и не настроена инфраструктура, я бы посоветовал против этого.Конечно, это может быть «правильный» способ организации очередей на платформе Microsoft, но он не очень прост и имеет довольно сложную кривую обучения.

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

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

1 голос
/ 23 марта 2010

Что такое validating?Перед тем, как приступить к разработке стратегии очередей, я постараюсь максимально быстро набрать validating, включая настройку на основе, если это не так.

0 голосов
/ 03 октября 2013

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

Я протестировал вставку времени, необходимого для вставки 100 записей базы данных, по сравнению с регистрацией точно таких же данных в локальном сообщении MSMQ. Затем я взял среднее значение результатов выполнения этого теста несколько раз.

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

Когда к базе данных обращались через приличное интернет-соединение, вставка строки в базу данных была в 6 раз медленнее, чем запись в MSMQ.

Итак:

Локальная база данных - БД работает быстрее, в противном случае MSMQ.

...