Учитывая, что вы имеете дело с очередью базы данных, у вас есть значительная часть работы, уже выполненной за вас из-за транзакционной природы баз данных. Типичное приложение, управляемое очередью, имеет цикл, который:
while(1) {
Start transction;
Dequeue item from queue;
process item;
save new state of item;
commit;
}
Если обработка завершается с ошибкой на полпути, транзакция откатывается, и элемент обрабатывается при следующем запуске службы.
Но запись очередей в базу данных на самом деле намного сложнее, чем вы думаете. Если вы развернете наивный подход, вы обнаружите, что ваша очередь и удаление блокируют друг друга, и страница ashx перестает отвечать. Затем вы обнаружите, что удаление из очереди и удаление из очереди зашли в тупик, и ваш цикл постоянно выдает ошибку 1205. Я настоятельно рекомендую вам прочитать эту статью Использование таблиц в качестве очередей.
Ваша следующая задача - получить «правильную» ставку объединения. Слишком агрессивно, и ваша база данных будет гореть от запросов на объединение. Слишком слабая, ваша очередь будет расти в часы пик и истощаться слишком медленно. Вам следует рассмотреть возможность использования совершенно другого подхода: использовать встроенный в SQL Server _2 _ и полагайтесь на магию семантики WAITFOR(RECEIVE)
. Это позволяет полностью отказаться от опроса при настройке самонагрузки. На самом деле, это еще не все: вам не нужна услуга для начала. См. Выполнение асинхронных процедур для объяснения того, о чем я говорю. : запуск обработки в SQL Server в асинхронном режиме из вызова веб-службы совершенно надежным способом. И, наконец, если логика должна быть в процессе C #, вы можете использовать Внешний активатор, который позволяет размещать обработку в автономных процессах, а не в процедурах T-SQL.
person
Remus Rusanu
schedule
16.07.2010