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