2010-03-23 4 views
5

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

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

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

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

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

Сейчас:

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

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

ответ

4

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

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

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

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

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

1

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

+0

У меня есть набор на основе Google, но я не совсем уверен, что вы подразумеваете под этим. Я сделал проверку как можно быстрее (теперь на 500 мс за сеанс), но все же, если одновременно утверждают 350 кандидатов, это составляет 175 секунд. Хотя, он уравновешен, поэтому на самом деле это 350/4 сек. Он работает, но процессор веб-сервера работает около 100% в течение нескольких минут. –

+1

с использованием операций «на основе набора» в отношении программирования баз данных - это когда вы выдаете единую команду базы данных, такую ​​как UPDATE, и она затрагивает все ваши строки, в отличие от циклизации по каждой строке и выполнения отдельного UPDATE для каждого. Я сделал google для «обработки на основе базы данных» и вот две статьи из верхней части: http://www.codeproject.com/KB/database/SetAndProceduralSQL.aspx и http://weblogs.sqlteam.com/jeffs /archive/2007/04/30/60192.aspx –

3

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

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

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

0

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

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

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

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

Итак:

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

+0

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

+0

Я наткнулся на эту цитату: «SSB будет значительно быстрее, чем MSMQ в транзакционном режиме. MSMQ будет быстрее, если вы будете работать в нетранслируемых режимах (наилучшее усилие, неупорядоченный, доставка)». Итак ... можно ли указать, были ли ваши тесты выполнены с транзакционной очередью или нетрудоспособной? – Mario

Смежные вопросы